我创建了一个包含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);
}
}
但这不是我想要的
答案 0 :(得分:2)
"当我点击JMenuBar的菜单时,我想打开另一个容器"
请勿MouseListener
使用JMenu
。使用MenuListener
或仅向JMenuItem
添加JMenu
,然后使用ActionListener
。
如果要删除组件并将其添加到容器,则需要revalidate()
和repaint()
。首先重新验证。
不要删除所有内容并添加新面板,而是使用CardLayout
,这样您就可以交换视图。详情请见How to Use CardLayout
答案 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();
}