JMenuItem重用
JMenuItem reuse
这是最小的工作应用程序:
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);
}
}
问题是当至少有一个菜单项被重复使用时,弹出菜单无法按预期工作。这不是什么大问题,可以通过复制重复使用的菜单项轻松避免,但我仍然想知道为什么会这样。有什么想法吗?
A JMenuItem
属于一个,并且只有一个,JPopupMenu
(或任何其他菜单)。您不能将一个 Swing 组件添加到多个容器;如果你这样做,那么该组件将自动从以前的容器中删除。
实际上,如果你愿意,你可以创建 Actions
。动作可以共享并添加到多个组件(JMenuItems、JButtons 等)。您甚至可以 enable/disable 将同时 enable/disable 所有组件的操作。
这是最小的工作应用程序:
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);
}
}
问题是当至少有一个菜单项被重复使用时,弹出菜单无法按预期工作。这不是什么大问题,可以通过复制重复使用的菜单项轻松避免,但我仍然想知道为什么会这样。有什么想法吗?
A JMenuItem
属于一个,并且只有一个,JPopupMenu
(或任何其他菜单)。您不能将一个 Swing 组件添加到多个容器;如果你这样做,那么该组件将自动从以前的容器中删除。
实际上,如果你愿意,你可以创建 Actions
。动作可以共享并添加到多个组件(JMenuItems、JButtons 等)。您甚至可以 enable/disable 将同时 enable/disable 所有组件的操作。