SwingUtilities.invokeLater: Probleme - Java, Swing, Swingutilities, invokelater

ich habe nie verstanden SwingUtilities.invokeLater, das ist der Grund, warum ich es bis jetzt vermieden habe.Aber es ist sehr wichtig, Swing Thread sicher zu machen. Bitte entschuldigen Sie mich, denn dies ist mein erstes Mal. Ich versuche, das Fenster nach einer Datenbankabfrage zu schließen. So weit ich es verstanden habe, jede Aktualisierung in UI muss von behandelt werden SwingUtilities.invokeLater. Hier ist meine Arbeit:

Main:

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***/////

}

Listener auf ADD-Taste

  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///
}
}

Listener auf Durchsuchen-Schaltfläche

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

Hier ist das Problem, Code zum Beenden.

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);

}
});

Bildschirm: Bildschirmfoto

Bitte erkläre mir, wo ich falsch liege, ich möchte es nicht benutzen System.exit und entschuldige, dass ich zu viele Fragen gestellt habe. Danke.

AKTUALISIEREN:

Hier ist ein Beispiel Arbeiten Code wie von @trashgod angefordert

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="";
}

Bitte führen Sie aus und sagen Sie, wie Sie ändern können exit() damit es das Fenster schließt. Danke nochmal.

Antworten:

6 für die Antwort № 1

Da der Standard-Schließvorgang Ihres Rahmens ist EXIT_ON_CLOSE, Du kannst senden WindowEvent.WINDOW_CLOSING über dispatchEvent(), wie gezeigt Hier. Angenommen 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);

Siehe auch Wie man Aktionen benutzt und folge gemeinsam Kodierungskonventionen.

Nachtrag: Basierend auf dem überarbeiteten Code folgt hier ein Ansatz Beenden das Programm. Hinweis Klassennamen beginnen in der Regel mit einem Großbuchstaben, während Instanznamen in Kleinbuchstaben stehen.

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 für die Antwort № 2

Gut, anstatt zu verwenden foo.setVisible(false), Ich habe es einfach geändert setVisible(false), und es hat funktioniert.


Verwandte Fragen
Speisekarte