点击JMenuBar打开一个新容器?

时间:2014-03-23 16:52:40

标签: java swing jmenu jmenubar

我创建了一个包含JMenuBar的窗口,当我点击JMenuBar的菜单(通过调用新类,按类分隔每个容器)时,我想打开另一个容器。但我不知道该怎么做。

实际上我重置了当前的容器并在其上添加项目......

public void mousePressed(MouseEvent arg0) 
{
  if(arg0.getSource()==login)
  { 
    cont.removeAll();
    MenuLogin menu= new MenuLogin();
    cont.add(menu);
    cont.repaint();
    Window.this.setVisible(true);
  }
}

但这不是我想要的

2 个答案:

答案 0 :(得分:2)

  

"当我点击JMenuBar的菜单时,我想打开另一个容器"

  1. 请勿MouseListener使用JMenu。使用MenuListener或仅向JMenuItem添加JMenu,然后使用ActionListener

  2. 如果要删除组件并将其添加到容器,则需要revalidate()repaint()。首先重新验证。

  3. 不要删除所有内容并添加新面板,而是使用CardLayout,这样您就可以交换视图。详情请见How to Use CardLayout


  4. How to Use Menus

    了解详情

答案 1 :(得分:1)

以下是我为您制作的一些代码,以便您了解如何执行此操作。

public class MenuBarShow extends JFrame implements ActionListener{
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("A menu");
JMenuItem item;
public MenuBarShow(){
    this.setVisible(true);
    this.setLayout(new BorderLayout());
    this.setSize(250,250);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    menu = new JMenu("A menu");
    item = new JMenuItem("An item");
    item.addActionListener(this);
    menuBar.add(menu);
    menu.add(item);
    this.add(menuBar, BorderLayout.NORTH);
    this.add(new JButton("Hello"), BorderLayout.CENTER);

}

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == item){
      //Create new JFrame when pressing the JMenuItem
        JFrame frame = new JFrame();
        frame.setVisible(true);
        frame.setLayout(new BorderLayout());
        frame.setSize(250, 250);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.setVisible(true);
        this.setVisible(false);
    }
}

public static void main(String []args){

    MenuBarShow mS = new MenuBarShow();

}

}

如您所见,您只需将您创建的帧的可见性设置为true,将前一帧设置为false即可。但是有一种更好的方法可以通过使用Cardlayout来处理它。您可以在http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html

找到更多相关信息

以下是使用cardLayout的相同代码。

public class MenuBarShow extends JFrame implements ActionListener{
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("A menu");
JMenuItem item;
JPanel p = new JPanel(new CardLayout());
JPanel mainPanel = new JPanel(new BorderLayout());
CardLayout cl = new CardLayout();
JPanel showThisPanel = new JPanel();

public MenuBarShow(){
    this.setVisible(true);
    this.setLayout(new BorderLayout());
    this.setSize(250,250);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    mainPanel.add(new JButton(BorderLayout.CENTER));

    cl = (CardLayout)(p.getLayout());
    p.add(showThisPanel, "STP");
    p.add(mainPanel, "MP");
    cl.show(p, "MP");
    this.add(p);


    menu = new JMenu("A menu");
    item = new JMenuItem("An item");
    item.addActionListener(this);
    menuBar.add(menu);
    menu.add(item);
    this.add(menuBar, BorderLayout.NORTH);

}

@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == item){
        cl.show(p, "STP");
    }
}

public static void main(String []args){

    MenuBarShow mS = new MenuBarShow();
}