0

私は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、同じように機能するようです...保持する必要がありますか、それとも削除できますか?それを削除した結果はどうなりますか?

前もって感謝します!

4

2 に答える 2

3

あなたのコードに何か問題はないと思います。ただし、スレッド化を処理するため、 invokeLaterを確実に保持する必要があります。つまり、他のAWTイベントが終了するまでこのイベントをキューに入れます。これにより、インターフェースがスムーズに実行され続けることが保証されます。

ただし、もちろん、このJDialogを別の場所で再利用する場合(および場所やサイズなどの小さな変更を行う場合)は、setTitleメソッドと(おそらく)setLocationRelativeToメソッドを呼び出し元のフレームに移動することをお勧めします。

于 2012-09-24T11:40:12.523 に答える
3

それは可能な方法の1つです。ダイアログ/ウィンドウごとにサブクラスを作成したい人がいるため、クラスは独自のレイアウトと(多くの場合)動作を管理しています。他の人々は委任をもっと好きです。つまり、ダイアログとそのレイアウトを作成する一種のファクトリメソッドを作成することによって各ダイアログのサブクラスを作成しないでください。柔軟性が高いので、このアプローチの方が良いと思います。コードをレイヤーに簡単に分離できます。たとえば、メインパネルを作成するレイヤー、サブパネルを作成するサブレイヤー、パネルをダイアログに配置する上位レイヤーなど。将来的には、ダイアログを処理するレイヤーを置き換えて、同じレイアウトをJFrameまたは他のパネルなどに配置できます。

に関してinvokeLater()-それはあなたのコードを非同期的に実行するだけです。これはあなたの場合には意味がありません。ただし、時間がかかるアクションには役立ちます。たとえば、ボタンのクリックで10秒かかるアクションを実行する場合は、このアクションを非同期で実行する必要があります。そうしないと、GUIが10秒間フリーズします。

于 2012-09-24T11:44:56.393 に答える