2013-02-16 40 views
1

首先在这里发表,所以请温柔!对于我的问题,我已经搜索了很多,但都没有找到答案。MVC在Swing中的多种形式

我努力学习和运用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     
} 

回答

2

所有Swing组件共享一个event dispatch thread,尽管应用程序通常使用singleJFrame。您可以了解更多关于MVC和Swing here

附录:顺便说一句,不要让GUI设计决定你的GUI设计。您需要了解如何手动使用Swing以了解使用设计器时遇到的问题。如here所示,您可以将内容添加到您选择的top-level container,并使用设计人员限制需要它的组件。

+0

为此欢呼。我只是要编辑我的问题...在TopLevelController中,我导致ShowImporter()函数是实例化和显示新窗体的不正确方法? – swshaun 2013-02-16 13:31:33

+0

ImportForm是一个JFrame btw ...我应该使用JInternalFrame? – swshaun 2013-02-16 13:35:58

+0

干杯Trashgod ...我也正好碰到这个作为你的链接的结果:http://docs.oracle.com/javase/tutorial/uiswing/misc/modality.html这是我与挣扎!我使用Netbeans GUI bulider来更好地理解MVC :-) – swshaun 2013-02-16 13:42:41