如何使用ActionListener在JFrame中插入JPanel?

时间:2016-12-05 09:35:37

标签: java swing jframe jpanel

package database;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.SwingUtilities;

public class Application {
    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new ApplicationFrame("Application");
                frame.setSize(500, 400);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });

    }

    public class ApplicationFrame extends JFrame {

        private CompaniesPanel companiesPanel;

        public ApplicationFrame(String title) {
            super(title);

            setLayout(new BorderLayout());

            JMenuBar menuBar = new MenuBar("Menu");

            Container container = getContentPane();
            container.add(menuBar, BorderLayout.NORTH);

        }
    }

    public class MenuBar extends JMenuBar {

        public MenuBar(String title) {
            super();

            JMenu menuFile = new JMenu("File");
            add(menuFile);

            JMenu menuOpen = new JMenu("Open");
            menuFile.add(menuOpen);

            JMenuItem menuItemCompanies = new JMenuItem("Companies");
            menuOpen.add(menuItemCompanies);

            menuItemCompanies.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent arg0) {
                    // In here I would like to take a CompaniesPanel and insert
                    // it into
                    // an ApplicationFrame if the Companies button is pressed on
                    // menu
                }

            });
        }
    }

    public class CompaniesPanel extends JPanel {
        public CompaniesPanel() {
            Dimension size = getPreferredSize();
            size.width = 250;
            setPreferredSize(size);

            setBorder(BorderFactory.createTitledBorder("Company Names"));

            setLayout(new GridBagLayout());

            GridBagConstraints gridBagConstraints = new GridBagConstraints();

        }
    }
}

我只是希望我的应用程序打开该菜单,其余部分为空白,并在从下拉菜单中按下公司时打开CompaniesPanel。这可能没有打开另一个jFrame吗?

1 个答案:

答案 0 :(得分:1)

container.add(menuBar, BorderLayout.NORTH);

所有这些都不是你如何在框架中添加菜单。框架具有为菜单栏保留的特殊区域。

相反,你只需使用:

setJMenuBar( menuBar );

阅读How to Use Menus上Swing教程中的部分,了解更多信息和工作示例。

如前所述,CardLayout将是一个不错的选择。通过添加两个面板(一个空,一个用于公司),布局的首选大小将由公司面板确定,因此当您显示公司面板时,框架大小不会改变。

Swing教程还有一个关于How so Use CardLayout的部分,其中有一些工作示例可帮助您入门。

为所有Swing基础知识保留对Swing教程的引用。