java jpopupmenu 无法显示_java – 从JButton显示/隐藏JPopupMenu; FocusListener无法正常工作?...

我需要一个带有附加下拉样式菜单的JButton.所以我拿了一个JPopupMenu并以你在下面的代码中看到的方式将它附加到JButton.它需要做的是:

>单击时显示弹出窗口

>如果再次点击,请隐藏它

>如果在弹出窗口中选择了某个项目,则将其隐藏

>如果用户点击屏幕中的其他位置,则隐藏它

这4件事情都有效,但由于我正在使用的布尔标志,如果用户点击其他地方或选择了一个项目,我必须在按钮上单击两次才会再次显示.这就是为什么我试图添加一个FocusListener(绝对没有响应)来修复它并在这些情况下将标志设置为false.

编辑:最后一次尝试回答帖子……

以下是监听器:(它在一个扩展JButton的类中,所以第二个监听器在JButton上.)

// Show popup on left click.

menu.addFocusListener(new FocusListener() {

@Override

public void focusLost(FocusEvent e) {

System.out.println("LOST FOCUS");

isShowingPopup = false;

}

@Override

public void focusGained(FocusEvent e) {

System.out.println("GAINED FOCUS");

}

});

addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

System.out.println("isShowingPopup: " + isShowingPopup);

if (isShowingPopup) {

isShowingPopup = false;

} else {

Component c = (Component) e.getSource();

menu.show(c,-1,c.getHeight());

isShowingPopup = true;

}

}

});

我现在已经用这个太久了.如果有人能给我一个关于这个问题的线索,那就太好了!

谢谢!

码:

public class Button extends JButton {

// Icon.

private static final ImageIcon ARROW_SOUTH = new ImageIcon("ArrowSouth.png");

// Unit popup menu.

private final JPopupMenu menu;

// Is the popup showing or not?

private boolean isShowingPopup = false;

public Button(int height) {

super(ARROW_SOUTH);

menu = new JPopupMenu(); // menu is populated somewhere else

// FocusListener on the JPopupMenu

menu.addFocusListener(new FocusListener() {

@Override

public void focusLost(FocusEvent e) {

System.out.println("LOST FOCUS");

isShowingPopup = false;

}

@Override

public void focusGained(FocusEvent e) {

System.out.println("GAINED FOCUS");

}

});

// ComponentListener on the JPopupMenu

menu.addComponentListener(new ComponentListener() {

@Override

public void componentShown(ComponentEvent e) {

System.out.println("SHOWN");

}

@Override

public void componentResized(ComponentEvent e) {

System.out.println("RESIZED");

}

@Override

public void componentMoved(ComponentEvent e) {

System.out.println("MOVED");

}

@Override

public void componentHidden(ComponentEvent e) {

System.out.println("HIDDEN");

}

});

// ActionListener on the JButton

addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

System.out.println("isShowingPopup: " + isShowingPopup);

if (isShowingPopup) {

menu.requestFocus();

isShowingPopup = false;

} else {

Component c = (Component) e.getSource();

menu.show(c,c.getHeight());

isShowingPopup = true;

}

}

});

// Skip when navigating with TAB.

setFocusable(true); // Was false first and should be false in the end.

menu.setFocusable(true);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值