【问题标题】:JMenuItem reuseJMenuItem 重用
【发布时间】:2017-12-26 08:31:45
【问题描述】:

这是最小的工作应用程序:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class JMenuItemReuse {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(TestFrame::new);
    }
}

class TestFrame extends JFrame {

    public TestFrame() {
        super();

        JPanel panel = new JPanel();

        JPopupMenu menu1 = new JPopupMenu();
        JPopupMenu menu2 = new JPopupMenu();
        JMenuItem item1 = new JMenuItem("reused");
        JMenuItem item2 = new JMenuItem("not reused");

        menu1.add(item1);
        menu2.add(item1); // works if this line is commented
        menu2.add(item2);

        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);
                if (SwingUtilities.isRightMouseButton(e)) {
                    menu1.show(panel, e.getX(), e.getY());
                } else {
                    menu2.show(panel, e.getX(), e.getY());
                }
            }
        });
        panel.add(new JLabel("popup-test"));
        add(panel);

        setPreferredSize(new Dimension(400, 400));
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
}

问题是当至少一个菜单项被重复使用时,弹出菜单无法按预期工作。这不是一个大问题,可以通过复制重复使用的菜单项轻松避免,但我仍然想知道为什么会这样。有什么想法吗?

【问题讨论】:

  • JMenuItemJComponent。一个JComponent 只能有一个父容器。这是 Swing 的限制。见stackoverflow.com/questions/4620601/…
  • 感谢您的评论
  • 不要重复使用 JMenuItems。而是重用 Actions,例如用于设置 JMenuItem 的 AbstractActions。

标签: java swing jmenuitem


【解决方案1】:

JMenuItem 属于一个,并且只有一个,JPopupMenu(或任何其他菜单)。您不能将 Swing 组件添加到多个容器中;如果你这样做了,那么组件将自动从前一个容器中删除。 如果你愿意,你可以创建Actions。动作可以共享并添加到多个组件(JMenuItems、JButtons 等)。您甚至可以启用/禁用将同时启用/禁用所有组件的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多