2012-09-29 73 views
1

首先,讓我指出我是編程Java桌面GUI的新手。我創建了一個可以容納多個JInternalFrame的桌面窗格。現在,每個JinternalFrame都包含相同的GUI組件,並且可以通過菜單項單擊創建新的jInternalFrame(以下稱爲內部框架)。爲不同內部框架中的jTable創建不同的數據模型

每個內部框架上的元素如下:3個Jlabels,3個JTextFields,一個Jbutton和一個Jtable。在渲染第一個內部框架之後,我使用信息填充3個文本字段,然後單擊該按鈕並將新行添加到表格中。該行包含用於填充文本字段的信息。

打開第二個內部框架給我,在視覺上,第一個確切的界面。我以相同的方式填充這個框架,點擊按鈕,瞧,第二幀中的表被填充。

當我返回到以前的內部框架時出現問題。我可以在沒有問題的情況下輸入文本字段,但單擊按鈕以填充表格會導致填充第二個內部框架中的表格。 我懷疑我是共享一個數據模型,但我不確定如何爲每個框架的GUI爲相同的時爲jInternalFrame jTables創建不同的數據模型。

下面是代碼(因爲我是新來的Java桌面GUI開發我跟着的甲骨文操作方法的一個渲染內部框架本身 - 很簡單的例子):

public class InternalFrames extends JFrame 
         implements ActionListener { 
private static final long serialVersionUID = 1L; 
JDesktopPane desktop; 

JLabel label1; 
JLabel label2; 
JLabel label3; 
JLabel label4; 

JTextField text1; 
JTextField text2; 
JTextField text3; 

JTable table1; 

public InternalFrames(){ 
    super("Practice Internal Frames"); 

    int inset = 50; 
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
    setBounds(inset,inset,screenSize.width - (inset*2),screenSize.height - (inset*2)); 
    desktop = new JDesktopPane(); 

    createFrame(); 
    setContentPane(desktop); 

    setJMenuBar(setMenuBar()); 


} 

protected JMenuBar setMenuBar(){ 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu menu = new JMenu("Document"); 
    menu.setMnemonic(KeyEvent.VK_D); 
    menuBar.add(menu); 

    JMenuItem menuItem = new JMenuItem("New"); 
    menuItem.setMnemonic(KeyEvent.VK_N); 
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D, ActionEvent.ALT_MASK)); 
    menuItem.setActionCommand("New"); 
    menuItem.addActionListener(this); 
    menu.add(menuItem); 

    menuItem = new JMenuItem("Quit"); 
    menuItem.setMnemonic(KeyEvent.VK_Q); 
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.ALT_MASK)); 
    menuItem.setActionCommand("Quit"); 
    menuItem.addActionListener(this); 
    menu.add(menuItem); 



    return menuBar; 
} 

public void actionPerformed(ActionEvent e){ 
    if ("New".equals(e.getActionCommand())){ 
     createFrame(); 
    } else if ("Quit".equals(e.getActionCommand())){ 

    } 

} 

protected void createFrame(){ 
    InternalFrame internalFrame = new InternalFrame(); 

    label1 = new JLabel("Name"); 
    label2 = new JLabel("Email Address:"); 
    label3 = new JLabel("Mobile Number:"); 
    label4 = new JLabel("Test Frames"); 

    label1.setSize(100,10); 
    label2.setSize(100,10); 
    label3.setSize(100,10); 
    label4.setSize(200,10); 

    text1 = new JTextField(40); 
    text2 = new JTextField(40); 
    text3 = new JTextField(40); 

    internalFrame.setLayout(new MigLayout()); 
    internalFrame.getContentPane().add(label1); 
    internalFrame.getContentPane().add(text1, "wrap"); 
    internalFrame.getContentPane().add(label2); 
    internalFrame.getContentPane().add(text2, "wrap"); 
    internalFrame.getContentPane().add(label3); 
    internalFrame.getContentPane().add(text3,"wrap"); 
    internalFrame.getContentPane().add(label4, "span 2, wrap"); 
    internalFrame.getContentPane().add(new JScrollPane(createTable()), "span 2 2, wrap"); 
    internalFrame.getContentPane().add(createButton()); 


    internalFrame.setVisible(true); 
    desktop.add(internalFrame); 

    try { 

     internalFrame.setSelected(true); 

    } catch (java.beans.PropertyVetoException pve){ } 


} 

protected JTable createTable(){ 
    DefaultTableModel dModel = new DefaultTableModel(); 
    table1 = new JTable(dModel); 
    dModel.addColumn("Name"); 
    dModel.addColumn("Email Address"); 
    dModel.addColumn("Mobile Number"); 

    return table1; 
} 

protected JButton createButton(){ 
    JButton button1 = new JButton("Add New List Member"); 
    button1.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) 
     { 
      //Execute when button is pressed 
      System.out.println("You clicked the button"); 
      populateTable(table1); 
     } 
    }); 
    return button1; 
} 

protected void populateTable(JTable theTable){ 

    if (validateEntry() == 0) 
    { 
     ListMembers listMember = new ListMembers(); 
     listMember.setName(text1.getText()); 
     listMember.setEmailAddress(text2.getText()); 
     listMember.setMobilePhone(text3.getText()); 
     Object[] data = {listMember.getName(),listMember.getEmailAddress(),listMember.getMobilePhone()}; 
     DefaultTableModel dm = (DefaultTableModel) table1.getModel(); 
     dm.addRow(data); 


    } 

} 

private static void createAndShowGUI(){ 
    JFrame.setDefaultLookAndFeelDecorated(true); 
    InternalFrames internalFrame = new InternalFrames(); 
    internalFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    internalFrame.setVisible(true); 

} 


public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 

} 
} 

任何幫助將是不勝感激。

回答

1

每次創建新框架時,都會使用此新創建的表初始化單個字段(table1)。並且您創建的每個按鈕的偵聽器都會填充由此唯一0123'變量引用的表格。這同樣適用於您的文本字段等。

要麼只使用局部變量,並在方法之間傳遞它們(例如,您需要將剛剛創建的表傳遞給創建按鈕的方法,以便爲此按鈕或者將所有代碼提取到新類中,MyInternalFrame(選擇一個更好的名稱),創建此新類的表,textfields和buttons實例字段,並且每次創建此MyInternalFrame類的新實例需要一個新的。

第二方案看起來像最好的給我。

+0

感謝這樣一個快速反應。我正在考慮定位和傳遞滿足之間的所有變量點頭,但它似乎是錯誤的。我同意你的看法,創建新班級可能是最好的方式。我會這樣實現它。再次感謝。 – EastCanShan

相關問題