如何在不同的类中将多个JPanel显示到我的JFrame上?

时间:2017-04-12 14:31:50

标签: java swing layout jframe jpanel

我将有一个菜单栏,我可以在其中选择多个选项,其中将为我显示一个不同的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;
    }

}

我的问题是,如何在不创建所述JFrame的新实例的情况下,成功地将不同类的多个JPanel显示到我的主JFrame上?

提前谢谢。

3 个答案:

答案 0 :(得分:2)

您的使用案例似乎非常适合CardLayout.

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

答案 1 :(得分:0)

每次都在创建一个新的JFrame,因为你告诉它(new JFrameTest();)。相反,做一些事情: -

JFrameTest frame = new JFrameTest();

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

答案 2 :(得分: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中。如果您发布该代码,我们可以解决您的问题。而且也不要像以前那样对完全相同的问题提出新问题

复制MenuBar的以下代码

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);

    }