2017-04-12 24 views
-2

我将在菜单栏中选择多个选项,其中将为我显示一个不同的JPanel到我的JFrame上。每当我从菜单栏中选择另一个选项时,不同的JPanel将占用JFrame的空间。如何将不同类的多个JPanel显示到我的JFrame上?

但是,使用此代码时,每次发出以下代码frame.getJPanelOne();时,都会创建一个新的JFrame,这是我不想要的。我只希望面板显示在我现有的JFrame上。

请记住,当我的程序启动时,将从JFrameTest类创建一个JFrame,并在顶部显示我的菜单栏,以便我可以在Panel 1和Panel 2之间进行选择。

如何用下面的代码成功地做到这一点?

public class MenuActionListener implements ActionListener { 

    private MyFrame frame; 

    public MenuActionListener (MyFrame frame) { 

     this.frame = frame; 

    } 

    public void displayPanelOne() { 
     JFrameTest frame = new JFrameTest(); 
     frame.getJPanelOne(); 
    } 
    public void displayPanelTwo() { 
     JFrameTest frame = new JFrameTest(); 
     frame.getJPanelTwo(); 
    } 
    @Override 
    public void actionPerformed(final ActionEvent e) { 
     String command = e.getActionCommand(); 

     switch (command) { 

      //Display panel one when I select the option on the menu bar 
      case "Panel One": 
       displayPanelOne(); 
       break; 

      //Display panel two when I select the option on the menu bar 
      case "Panel Two": 
       displayPanelTwo(); 
       break; 
      default: 
     } 
    } 
} 

这里是我JFrameTest类:

public class JFrameTest extends JFrame { 

    private JPanel panelMain; 
    private JPanelOne panel1; 
    private JPanelTwo panel2; 
    private JMenuBar menuBar; 

    public JFrameTest() { 

     MenuBar menuBarInstance = new MenuBar(); 

     frame = new JFrame(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     getContentPane().setPreferredSize(new Dimension(720, 480)); 
     setJMenuBar(menuBarInstance.getMenuBar()); 
     menuBar.getMenu(0).getItem(0).addActionListener(new MenuActionListener(this)); 
     menuBar.getMenu(0).getItem(1).addActionListener(new MenuActionListener(this)); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 

     panelMain = new JPanel(); 
     panelMain.setBounds(0, 0, 420, 90); 
     panelMain.setPreferredSize(new Dimension(200, 40)); 
     add(panelMain); 

    } 

    public JPanel getJPanelOne() { 

     panel1 = new JPanelOne(); 
     panelMain.add(panel1); 

     return panelMain; 
    } 

    public JPanel getJPanelTwo() { 
     panel2 = new JPanelTwo(); 
     panelMain.add(panel2); 

     return panelMain; 
    } 

} 

这里是我的两个JPanel的类,在其中,每当我选择菜单栏中的相应的项目将被添加:

public class JPanelOne extends JPanel 
{ 
    public JPanelOne() 
    { 
     // setting up black JPanel 
     JPanel panel = new JPanel(); 
     panel.setPreferredSize(new Dimension(220, 40)); 
     panel.setBackground(Color.BLACK); 

     JLabel label = new JLabel("Panel One"); 

     // adding button to the black JPanel 
     panel.add(label); 

     // adding blackJPanel 
     add(panel); 
    } 
} 

而且为我的另一个小组提供单独的课程。

public class JPanelTwo extends JPanel 
    { 
     public JPanelTwo() 
     { 
      // setting up black JPanel 
      JPanel panel = new JPanel(); 
      panel.setPreferredSize(new Dimension(220, 40)); 
      panel.setBackground(Color.RED); 

      JLabel label = new JLabel("Panel One"); 

      // adding button to the black JPanel 
      panel.add(label); 

      // adding blackJPanel 
      add(panel); 
     } 
    } 

创建菜单的操作侦听器,并将其添加到我的GUI:

public class MenuBar { 

    private JMenuBar menuBar; 
    private MyFrame frame; 

    public MenuBar() { 

     System.out.println("menuBar"); 

     //Creates a menubar for a JFrame 
     menuBar = new JMenuBar(); 

     //Define addMenu items 
     JMenuItem addPanelOneItem = new JMenuItem("Panel One"); 
     addPanelOneItem.setActionCommand("Panel One"); 

     //Define addMenu items 
     JMenuItem addPanelTwoItem = new JMenuItem("Panel Two"); 
     addPanelTwoItem.setActionCommand("Panel Two"); 

     JMenu menu = new JMenu("Test"); 
     menuBar.add(menu); 
     menu.add(addPanelOneItem); 
     menu.add(addPanelOneItem); 

    public JMenuBar getMenuBar() 
    { 
     return menuBar; 
    } 

} 

我的问题是,我如何才能成功地显示来自不同类的多个JPanel的到我的主要的JFrame而不创建新实例说的JFrame ?

预先感谢您。

+0

发布所有代码... – XtremeBaumer

+1

使用['CardLayout'](http://download.oracle.com/javase/8/docs/api/java/awt/CardLayout.html),如[this答案](http://stackoverflow.com/a/5786005/418556)。 –

+0

在MenuBar()类中,'frame'从不设置,所以'ActionListener listener = new MenuActionListener(frame);'有一个错误。 –

回答

2

您的使用案例,看起来非常完美CardLayout.

在卡片布局中,您可以在同一位置添加多个面板,但一次显示或隐藏一个面板。

+0

如果我无法按我想要的方式运行我的应用程序,这可能是我必须采取的选择。感谢您的帮助。 – juiceb0xk

0

它每次都创建一个新的JFrame,因为您要告诉它(new JFrameTest();)。相反,这样做: -

JFrameTest frame = new JFrameTest(); 

public void displayPanelOne() { 
    // todo - remove existing panel if required? 
    frame.getJPanelOne(); 
} 
+0

当我尝试这种方式出于某种奇怪的原因时,我得到一个StackOverflowError。我已经尝试过XtremeBaumer的方式,但我仍然产生NullPointerException错误。 – juiceb0xk

+0

你有堆栈跟踪吗? –

+0

我无法捕捉到'JFrameTest frame = new JFrameTest();'的栈,因为这是我无法放置任何代码来捕捉它的地方。我的猜测是它一直循环遍历MyFrame,然后产生一个StackOverflowError。我不确定如何解决这个问题。 – juiceb0xk

0

您MenuActionListener类应该是这样的:

public class MenuActionListener implements ActionListener { 
    private JFrameTest frame; 
    public MenuActionListener(JFrameTest frame){ 
     this.frame=frame; 
    } 

    public void displayPanelOne() { 
     frame.getJPanelOne(); 
    } 
    public void displayPanelTwo() { 
     frame.getJPanelTwo(); 
    } 
    @Override 
    public void actionPerformed(final ActionEvent e) { 
     String command = e.getActionCommand(); 

     switch (command) { 

      //Display panel one when I select the option on the menu bar 
      case "Panel One": 
       displayPanelOne(); 
       break; 

      //Display panel two when I select the option on the menu bar 
      case "Panel Two": 
       displayPanelTwo(); 
       break; 
      default: 
     } 
    } 
} 

,并再次,我们缺少的代码的重要组成部分,在其上创建了MenuActionListener,并将其添加到你的GUI。如果您发布该代码,我们可以解决您的问题。而且也不要对相同问题的新问题作为

public class MenuBar { 

    private JMenuBar menuBar; 
    private MyFrame frame; 

    public MenuBar() { 
     System.out.println("menuBar"); 
     //Creates a menubar for a JFrame 
     menuBar = new JMenuBar(); 

     //Define addMenu items 
     JMenuItem addPanelOneItem = new JMenuItem("Panel One"); 
     addPanelOneItem.setActionCommand("Panel One"); 

     //Define addMenu items 
     JMenuItem addPanelTwoItem = new JMenuItem("Panel Two"); 
     addPanelTwoItem.setActionCommand("Panel Two"); 
     JMenu menu = new JMenu("Test"); 
     menuBar.add(menu); 
     menu.add(addPanelOneItem); 
     menu.add(addPanelOneItem); 
    } 
public JMenuBar getMenuBar() 
    { 
     return menuBar; 
    } 

} 

,并在您JFrameTest类,你再经过 setJMenuBar(menuBarInstance.getMenuBar());

复制你的菜单栏的下面的代码添加这些代码行数:

menuBar.getMenu(0).getItem(0).addActionListener(new MenuActionListener(this)); 
menuBar.getMenu(0).getItem(1).addActionListener(new MenuActionListener(this)); 


public JFrameTest() { 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     getContentPane().setPreferredSize(new Dimension(720, 480)); 
     menuBar=new MenuBar().getMenuBar(); 
     menuBar.getMenu(0).getItem(0).addActionListener(new MenuActionListener(this)); 
     menuBar.getMenu(0).getItem(1).addActionListener(new MenuActionListener(this)); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 

     panelMain = new JPanel(); 
     panelMain.setBounds(0, 0, 420, 90); 
     panelMain.setPreferredSize(new Dimension(200, 40)); 

     add(panelMain); 
     setJMenuBar(menuBar); 

    } 
+0

您好,感谢您的帮助 - 我发布了缺失的代码。这就是我如何初始化我的菜单项并添加一个动作侦听器来显示我的面板。 – juiceb0xk

+0

在我的'MenuActionListener'类中,我现在在下面一行生成一个NullPointerException错误:'frame.getPanelOne();',第二个面板也是如此。 什么是null? – juiceb0xk

+0

@ juiceb0xk我更新了我的答案 – XtremeBaumer

相关问题