2012-01-05 79 views
1

我有1個JFrame和10個JPanel組件作爲單獨的類。 jframe上也有JMenuBar。當一個菜單項被點擊時,我刪除jframe的所有contentPane(removeAll)並添加一個我的jpanel。在actionperformed偵聽器中創建jpanel?

這是我的代碼;

// this function changes panel 
public static void SwitchPanel(Component comp) 
{ 
    Container panel = getContentPane(); 
    panel.removeAll(); 

    panel.add(comp); 
    panel.revalidate(); 
    panel.repaint(); 
} 

// this function defines menu items and their listeners 
public JMenuItem AddMenuItem(JMenu menu, String name, final JPanel toPanel) { 
    JMenuItem menuItem = new JMenuItem(name); 
    menu.add(menuItem); 

    menuItem.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      SwitchPanel(toPanel); 
     } 
    }); 

    return menuItem; 
} 

和我添加這樣的菜單項;

AddMenuItem(menu1, "some menu item", new MyPersonalJPanel()); 

一切正常。但我想創建新的jpanel時點擊相關的菜單項。我的意思是創建jpanel,如果只有它是必要的。當前代碼首先創建所有jpanel。當我點擊一個菜單項時,顯示jpanel之前創建的。

我認爲這可以用Class.forName方法完成,但我無法弄清楚。任何幫助?

回答

1

您應該在public void actionPerformed(ActionEvent e)方法中執行new MyPersonalJPanel()。這樣,每次用戶點擊菜單時都會創建面板。然後

您的代碼將是:

// this function defines menu items and their listeners 
public JMenuItem AddMenuItem(JMenu menu, String name) { 
    JMenuItem menuItem = new JMenuItem(name); 
    menu.add(menuItem); 

    menuItem.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      SwitchPanel(new MyPersonalJPanel()); 
     } 
    }); 

    return menuItem; 
} 
+0

MyPersonalJPanel是每個菜單項不同。我是否必須爲每個菜單項編寫單獨的監聽器?我試圖避免這種情況。 – 2012-01-05 22:24:56

+1

您也可以將面板的類對象作爲AddMenuItem參數傳遞,然後執行Class.newInstance()。然而,它通常會被認爲是不安全的:如果構造函數改變它將編譯,但在運行時失敗。我寧願將ActionListener實例作爲參數傳遞給AddMenuItem方法。 – Guillaume 2012-01-05 22:28:54

+0

我認爲通過構造函數而不是類,但仍然很費力的很少。我會通過聽衆,謝謝你的幫助。 – 2012-01-05 22:56:52

相關問題