如何在我的 JFrame 上显示来自不同 类 的多个 JPanel?

How can I display multiple JPanel's from different classes onto my JFrame?

我将有一个菜单栏,我可以在其中 select 多个选择,其中会在我的 JFrame 上为我显示不同的 JPanel。每当我从菜单栏中选择另一个选项时,不同的 JPanel 将占据 JFrame 的 space.

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

请记住,当我的程序启动时,一个 JFrame 是从 JFrameTest class 创建的,并且还在顶部显示我的菜单栏,因此我可以 select 在第一面板和第二面板之间。

如何使用以下代码成功完成此操作?

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 class:

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 classes,只要我 select 菜单栏中的适当项目就会添加到其中:

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

还有一个单独的 class 用于我的另一个面板。

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 的新实例的情况下成功地将来自不同 classes 的多个 JPanel 显示到我的主 JFrame 上?

提前谢谢你。

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

JFrameTest frame = new JFrameTest();

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

您的 MenuActionListener class 应该如下所示:

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。如果您 post 该代码,我们可以解决您的问题。也不要对与以前完全相同的问题提出新问题

复制 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 class 你之后 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);

    }

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

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