【问题标题】:Create jpanel in actionperformed listener?在 actionperformed 监听器中创建 jpanel?
【发布时间】:2012-02-03 17:54:07
【问题描述】:

我有 1 个 JFrame 和 10 个 JPanel 组件作为单独的类。 jframe 上还有 JMenuBar。单击菜单项时,我会删除 jframe (removeAll) 的 contentPane 的所有内容并添加我的一个 jpanel。

这是我的代码;

// this function changes panel
public static void SwitchPanel(Component comp)
{
    Container panel = getContentPane();
    panel.removeAll();

    panel.add(comp);
    panel.revalidate();
    panel.repaint();
}

// this function defines menu items and their listeners
public JMenuItem AddMenuItem(JMenu menu, String name, final JPanel toPanel) {
    JMenuItem menuItem = new JMenuItem(name);
    menu.add(menuItem);

    menuItem.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            SwitchPanel(toPanel);
        }
    });

    return menuItem;
}

然后我添加这样的菜单项;

AddMenuItem(menu1, "some menu item", new MyPersonalJPanel());

一切正常。但是我想在单击相关菜单项时创建新的 jpanel。我的意思是只在必要时创建 jpanel。当前代码首先创建所有 jpanels。当我单击一个菜单项时,显示之前创建的 jpanel。

我认为可以使用 Class.forName 方法来完成,但我想不通。有什么帮助吗?

【问题讨论】:

    标签: java swing listener


    【解决方案1】:

    您应该在public void actionPerformed(ActionEvent e) 方法中执行new MyPersonalJPanel()。这样,每次用户单击菜单时都会创建面板。

    您的代码将是:

    // this function defines menu items and their listeners
    public JMenuItem AddMenuItem(JMenu menu, String name) {
        JMenuItem menuItem = new JMenuItem(name);
        menu.add(menuItem);
    
        menuItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SwitchPanel(new MyPersonalJPanel());
            }
        });
    
        return menuItem;
    }
    

    【讨论】:

    • MyPersonalJPanel 对于每个菜单项都不同。我是否必须为每个菜单项编写单独的侦听器?我正在努力避免这种情况。
    • 您也可以将面板的 Class> 对象作为 AddMenuItem 参数传递,然后执行 Class.newInstance()。然而,它通常被认为是不安全的:如果构造函数发生变化,它将编译但在运行时失败。我更喜欢将 ActionListener 实例作为参数传递给方法 AddMenuItem。
    • 我认为传递构造函数而不是类,但仍然付出了很多努力却收效甚微。我会通过听众,感谢您的帮助。
    猜你喜欢
    • 2013-12-06
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多