SwingUtilities.invokeLater:问题

joe*_*han 2 java swing invokelater swingutilities

我永远不明白SwingUtilities.invokeLater,这就是我一直避免它的原因.但是让Swing Thread安全是非常重要的.好吧请原谅,因为这是我第一次这样做.我试图在一些数据库查询后关闭窗口.所以,据我所知,任何更新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***/////           

}
Run Code Online (Sandbox Code Playgroud)

listd on ADD按钮

  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///     
    }
 }
Run Code Online (Sandbox Code Playgroud)

列表器上的浏览按钮

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

这是问题,代码退出.

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

    }
    });
Run Code Online (Sandbox Code Playgroud)

屏幕: 短屏幕

请解释我哪里出错了,我不想用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="";
}
Run Code Online (Sandbox Code Playgroud)

请运行并告诉如何修改exit()它以关闭窗口.再次感谢.

tra*_*god 6

因为你的窗体的默认close操作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);
Run Code Online (Sandbox Code Playgroud)

另请参见如何使用操作并遵循常见的编码约定.

附录:根据修订后的代码,这是退出该计划的一种方法.注意类名通常以大写字母开头,而实例名称以小写字母开头.

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;
...
Run Code Online (Sandbox Code Playgroud)