我將在菜單欄中選擇多個選項,其中將爲我顯示一個不同的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 ?
預先感謝您。
發佈所有代碼... – XtremeBaumer
使用['CardLayout'](http://download.oracle.com/javase/8/docs/api/java/awt/CardLayout.html),如[this答案](http://stackoverflow.com/a/5786005/418556)。 –
在MenuBar()類中,'frame'從不設置,所以'ActionListener listener = new MenuActionListener(frame);'有一個錯誤。 –