gpt4 book ai didi

java - 组件及其内容上的 Swing 弹出菜单

转载 作者:行者123 更新时间:2023-12-01 22:47:22 25 4
gpt4 key购买 nike

我有一个组件(Widget - 扩展了 JPanel),我在其中实现了一个简单的弹出菜单。当单击面板边框时,它可以工作,基本上除了面板布局包含面板内其他组件的地方之外的任何地方。

因此,如果面板内有一个 JTable,我可以在单击它旁边时调用菜单(如果没有其他内容),但是当单击 JTable 时,不会发生任何事情(该表显然位于面板顶部,阻止MouseAdapter 来注册点击)。

即使右键单击面板内的组件,我是否可以以某种方式调用弹出菜单?以下是我如何创建和调用菜单的示例代码:

private void initPopupMenu() {
popup = new JPopupMenu();

JMenuItem closeItem = new JMenuItem("Close");
closeItem.setActionCommand(WidgetConstants.Actions.CLOSE.name());
closeItem.addActionListener(this);
popup.add(closeItem);

JMenuItem minimizeItem = new JMenuItem("Minimize");
minimizeItem.setActionCommand(WidgetConstants.Actions.MINIMIZE.name());
minimizeItem.addActionListener(this);
popup.add(minimizeItem);
}

MouseInputListener componentListener = new MouseInputAdapter() {

@Override
public void mousePressed(MouseEvent me) {
// popup
if (me.isPopupTrigger()) {
popup.show(me.getComponent(), me.getX(), me.getY());
}
}

@Override
public void mouseReleased(MouseEvent ev) {
if (ev.isPopupTrigger()) {
popup.show(ev.getComponent(), ev.getX(), ev.getY());
}
}
}

@Override
public void setBorder(Border border) {
removeMouseListener(componentListener);
removeMouseMotionListener(componentListener);
if (border instanceof WidgetBorder) {
addMouseListener(componentListener);
addMouseMotionListener(componentListener);
}
super.setBorder(border);
}

感谢您的任何提示。

最佳答案

首先:您不需要使用鼠标监听器。每个 JComponent 都有方法 setComponentPopupMenu(JPopupMenu)。第二:您可以遍历组件树并为每个组件注册弹出菜单。

这里是示例:

/**
* Provides component hierarchy traversal.
*
* @param aContainer start node for the traversal.
*/
private void traverse(Container aContainer, JPopupMenu aMenu) {
for (final Component comp : aContainer.getComponents()) {
if (comp instanceof JComponent) {
((JComponent) comp).setComponentPopupMenu(aMenu);
}
if (comp instanceof Container) {
traverse((Container) comp, aMenu);
}
}
}

关于java - 组件及其内容上的 Swing 弹出菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25134108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com