我是Java桌面应用程序编程的新手,所以希望获得一些帮助...

我在构建器中添加了框架的组件。

当单击主框架的按钮时,将显示如下对话框:

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
            BehaviorDialog behavDialog = new BehaviorDialog(this, rootPaneCheckingEnabled);
            behavDialog.setVisible(true);
    }


我的BehaviorDialog类是这样的:

public class BehaviorDialog extends javax.swing.JDialog {

/**
 * Creates new form BehaviorDialog
 */
public BehaviorDialog(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    initComponents();
    setTitle("Add behavior");
    setLocationRelativeTo(this);
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
//....
}// </editor-fold>

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /* Set the Nimbus look and feel */

    /* Create and display the dialog */
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
                BehaviorDialog dialog = new BehaviorDialog(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    //...
    // End of variables declaration
}


我的问题是:


这是开始帧/对话框的正确方法吗? (它有效,但是我想确定这是否是最好的方法...)
当我在invokeLater()中删除​​main时,它的工作方式似乎相同...应该保留它还是可以删除它?删除它会有什么后果?


提前致谢!

最佳答案

这是可能的方法之一。有些人喜欢为每个对话框/窗口创建子类,因此该类正在管理自己的布局和(通常)行为。其他人更喜欢委托,即不要通过创建一种创建对话框及其布局的工厂方法来为每个对话框创建子类。我认为这种方法更好,因为它更灵活。您可以更轻松地将代码分为几层。例如,创建主面板的层,创建子面板的子层,将面板放入对话框的更高层等。将来,您可以替换处理对话框的层并将相同的布局放入JFrame或其他面板中,等等。

关于invokeLater()-它只是异步运行您的代码。在您的情况下,这没有意义。但这对于需要时间的操作很有用。例如,如果您要执行在单击按钮时需要10秒钟的操作,则可能要异步运行此操作。否则,您的GUI将冻结10秒钟。

10-06 16:02