2017-04-12 30 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

相關問題