SwingUtilities.invokeLater: मुद्दे - जावा, स्विंग, स्विंग्यूटिविटीज, invokelater

मैंने कभी नहीं समझा SwingUtilities.invokeLater, यही कारण है कि मैं अब तक इसे टाल रहा था।लेकिन स्विंग थ्रेड को सुरक्षित बनाना बहुत महत्वपूर्ण है। अच्छा कृपया मुझे क्षमा करें, क्योंकि यह मेरा पहला समय है। मैं कुछ डेटा बेस क्वेरी के बाद विंडो बंद करने की कोशिश कर रहा हूं। इसलिए, जहां तक ​​मैं समझ गया, में कोई अद्यतन UI द्वारा संभाला जाना चाहिए SwingUtilities.invokeLaterयह मेरा काम है:

मुख्य:

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new forminsert().setVisible(true);
forminsert f=new forminsert();
}
});

}
public forminsert() {
initComponents();
}

public class forminsert extends javax.swing.JFrame {
private void initComponents() {

jPanel1 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jButton3 = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setUndecorated(true);

jPanel1.setBackground(new java.awt.Color(0, 0, 0));
jPanel1.setBorder(javax.swing.BorderFactory.createMatteBorder(3, 3, 3, 3, new java.awt.Color(0, 204, 204)));
/////***REST CODE***/////

}

एडीडी बटन पर श्रोता

  private void jButton2ActionPerformed(java.awt.event.ActionEvent evt)               {
new Thread(new thread1()).start();

}
public class thread1 implements Runnable
{

public void run() {
insert ins=new insert();
////code for inserting///
}
}

ब्राउज़ बटन पर श्रोता

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                {
JFileChooser ss=new JFileChooser();
////Code to choose the file////
}

यहां समस्या है, बाहर निकलने के लिए कोड।

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

forminsert f=new forminsert();f.call();
}

public  void call()
{
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
jPanel1.setVisible(false);
getRootPane().setVisible(false);

}
});

स्क्रीन: स्क्रीनशॉट

कृपया मुझे बताएं कि मैं गलत कहां जा रहा हूं, मैं इसका उपयोग नहीं करना चाहता हूं System.exit और मुझे बहुत सारे प्रश्न पूछने के लिए क्षमा करें। धन्यवाद।

अद्यतन करें:

यहां एक नमूना है काम कर रहे @trashgod द्वारा अनुरोध के रूप में कोड

package faltur;

import java.io.File;
import javax.swing.JFileChooser;

public class insert extends javax.swing.JFrame {

/** Creates new form insert */
public insert() {
initComponents();
}


@SuppressWarnings("unchecked")

private void initComponents() {

jPanel1 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setUndecorated(true);

jPanel1.setForeground(new java.awt.Color(240, 240, 240));

jButton1.setText("Browse..");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});

jButton2.setText("exit");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.addComponent(jButton1)
.addGap(31, 31, 31)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 185, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(153, 153, 153)
.addComponent(jButton2)))
.addContainerGap(99, Short.MAX_VALUE))
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup()
.addGap(66, 66, 66)
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(87, 87, 87)
.addComponent(jButton2)
.addContainerGap(94, Short.MAX_VALUE))
);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,   javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);

pack();
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                {
JFileChooser ss=new JFileChooser();
ss.showOpenDialog(jTextField1);

File f=ss.getSelectedFile();

path=f.toString();
System.out.println(path);

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
insert in=new insert();
in.exit();/////////////CALLS exit()/////////////////modify this//////
}


public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new insert().setVisible(true);
}
});
}
public void exit()////////////////////////MODIFY THIS///////////////////
{
jPanel1.getRootPane().setVisible(false);

}

private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JPanel jPanel1;
private javax.swing.JTextField jTextField1;

public String path="";
}

कृपया चलाएं और बताएं कि कैसे संशोधित करें exit() ताकि वह खिड़की बंद कर दे। एक बार फिर धन्यवाद।

उत्तर:

उत्तर № 1 के लिए 6

क्योंकि आपके फ्रेम का डिफ़ॉल्ट बंद ऑपरेशन है EXIT_ON_CLOSE, आप भेज सकते है WindowEvent.WINDOW_CLOSING के जरिए dispatchEvent(), के रूप में दिखाया यहाँ। एक दिया गया JFrame f,

private static final String EXIT = "Exit";
private Action exit = new AbstractAction(EXIT) {

@Override
public void actionPerformed(ActionEvent e) {
f.dispatchEvent(new WindowEvent(
f, WindowEvent.WINDOW_CLOSING));
}
};
private JButton b = new JButton(exit);

यह भी देखें क्रियाओं का उपयोग कैसे करें और आम का पालन करें कोडिंग सम्मेलन

अनुपूरक: संशोधित कोड के आधार पर, यहां एक दृष्टिकोण है बाहर निकलने कार्यक्रम। नोट क्लास नाम आम तौर पर पूंजी पत्र से शुरू होते हैं, जबकि इंस्टेंस नाम कम केस होते हैं।

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
insert.dispatchEvent(new WindowEvent(
insert, WindowEvent.WINDOW_CLOSING));
}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
insert = new Insert();
insert.setVisible(true);
}
});
}

private static Insert insert;
...

जवाब के लिए 3 № 2

ठीक है उपयोग करने के बजाय foo.setVisible(false), बस मैंने इसे बदल दिया setVisible(false), और यह काम किया।


संबंधित सवाल
सबसे लोकप्रिय