2012-01-05 7 views
1

私は1つのJFrameと10個のJPanelコンポーネントを別々のクラスとして持っています。 jframeにはJMenuBarもあります。メニュー項目をクリックすると、jframe(removeAll)のcontentPaneのすべてのコンテンツが削除され、jpanelsの1つが追加されます。実行されたリスナーで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を作成することを意味します。現在のコードはすべてのjpanelsを最初に作成します。メニュー項目をクリックすると、前に作成した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は、すべてのメニュー項目ごとに異なります。すべてのメニュー項目に別々のリスナーをコーディングする必要がありますか?私はそれを避けようとしています。 –

+1

パネルにクラスオブジェクトをAddMenuItemパラメータとして渡し、Class.newInstance()を実行することもできます。しかし、多くの場合、安全でないとみなされます。コンストラクタが変更されると、コンパイルされますが実行時には失敗します。メソッドAddMenuItemへのパラメータとしてActionListenerインスタンスを渡すことをお勧めします。 – Guillaume

+0

私はクラスの代わりにコンストラクタを渡したと思っていましたが、ほとんど利益のためにまだ多くの努力をしています。リスナーを助けてくれてありがとう。 –

関連する問題