1

初投稿なのでお手柔らかに!私は自分の質問に対する答えを広く探しましたが、何も見つかりませんでした。

MVC アーキテクチャを学習して適用し、Java Swing アプリケーションを作成しようとしています。モデル、ビュー、コントローラーのそれぞれの役割が理解できたと思います。

ただし、私のアプリケーションには JMenuBar (ファイル、編集など...) があります。

私がやりたいことは、ポップアップするフォーム (DVSDesk クラスからコントローラーに委任される) のメニュー項目をクリックした後です。

私が抱えている問題は、コントローラーとモデルを受け入れるフォームを表示する方法です-私が読んだことから、各JFrameには独自のスレッドが必要であり、混乱します。はinvokeLater独自のスレッドにあるため、モデルやコントローラーを渡すことができないようです。

これがばかげた質問である場合は申し訳ありませんが、私は多くの検索を行ってきましたが、どこにも速くないようです!

編集- 私の本当の質問 - showImporterForm() は、新しいフォームを作成して表示する正しい方法ですか?

以下は、メイン スレッド (DVSMain.java) のコードです。

public static void main(String[] args) {
    TopLevelController TLC;
    TopLevelModel TLM;

     java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            TopLevelModel TLM = new TopLevelModel();
            TopLevelController TLC = new TopLevelController(TLM);
        }
    });
}

以下はコントローラーのコードです (TopLevelController.java)。

public class TopLevelController {    
// Initialise model and view
TopLevelModel TLM;
DVSDesk TLV;

public TopLevelController(TopLevelModel model) {
    // Get a reference to the view and model
    TLM = model;
    TLV = new DVSDesk(this,model);
    TLV.setVisible(true);
}

public void showImporter() {
    ImportForm importFm = new ImportForm(this,TLM);
    importFm.setVisible(true);
}

/*public void showForm(final Form fm) {        
    // Show the form which has been passed in

    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {                
            fm.show();
        }
    });
}*/

public void quit() {System.exit(0);};
}

以下は、DVSDesk.java (メニュー ベースの GUI) のコードです...

public class DVSDesk extends javax.swing.JFrame {

/**
 * Creates new form DVSDesk
 */

TopLevelController TLC;
TopLevelModel TLM;

public DVSDesk(TopLevelController controller, TopLevelModel model) {
    initComponents();
    TLC = controller;
    TLM = model;
}

/**
 * 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() {

    jLayeredPane1 = new javax.swing.JLayeredPane();
    jSeparator1 = new javax.swing.JSeparator();
    jMenuBar1 = new javax.swing.JMenuBar();
    jMenu1 = new javax.swing.JMenu();
    fImportDiags = new javax.swing.JMenuItem();
    jSeparator2 = new javax.swing.JPopupMenu.Separator();
    fQuit = new javax.swing.JMenuItem();
    jMenu2 = new javax.swing.JMenu();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jMenu1.setText("File");

    fImportDiags.setText("Import Diagrams...");
    fImportDiags.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            fImportDiagsActionPerformed(evt);
        }
    });
    jMenu1.add(fImportDiags);
    jMenu1.add(jSeparator2);

    fQuit.setText("Quit...");
    fQuit.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            fQuitActionPerformed(evt);
        }
    });
    jMenu1.add(fQuit);

    jMenuBar1.add(jMenu1);

    jMenu2.setText("Edit");
    jMenuBar1.add(jMenu2);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 800, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGap(0, 579, Short.MAX_VALUE)
    );

    pack();
}// </editor-fold>                        

private void fQuitActionPerformed(java.awt.event.ActionEvent evt) {                                      
    TLC.quit();
}                                     

private void fImportDiagsActionPerformed(java.awt.event.ActionEvent evt) {                                             
    TLC.showImporter();
}                                            

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /*
     * Set the Nimbus look and feel
     */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /*
     * If Nimbus (introduced in Java SE 6) is not available, stay with the
     * default look and feel. For details see
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(DVSDesk.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(DVSDesk.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(DVSDesk.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(DVSDesk.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>
}
// Variables declaration - do not modify                     
private javax.swing.JMenuItem fImportDiags;
private javax.swing.JMenuItem fQuit;
private javax.swing.JLayeredPane jLayeredPane1;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JPopupMenu.Separator jSeparator2;
// End of variables declaration                   
}
4

1 に答える 1

2

すべての Swing コンポーネントは共通のイベント ディスパッチ スレッドを共有しますが、アプリケーションは通常、単一の JFrame. MVC と Swing の詳細については、こちらをご覧ください。

補遺: 余談ですが、GUI 設計者に GUI 設計を指示させないでください。デザイナーの使用時に発生する問題を理解するには、Swing を手動で使用する方法を理解する必要があります。ここに示すように、選択した最上位のコンテナーにコンテンツを追加し、それを必要とするコンポーネントに対してデザイナーの使用を制限できます。

于 2013-02-16T13:24:41.183 に答える