【问题标题】:How to escape from mouseListener?如何逃离mouseListener?
【发布时间】:2017-11-03 10:40:51
【问题描述】:

我有:

  • 从 JFrame 扩展的类;
  • JTextField 的元素列表 - JTextField[] pix。

当点击 pix[i] - JFrame 必须图标化,并且在屏幕的任何点下一次点击必须完全改变 textField (pix[i]) 而不影响另一个 textFields,然后框架必须标准化,之后的任何 mouseClicks ( not on textField) 不能影响那些元素。

使用 jnativehook 库处理的 JFrame 之外的点击。

这里的那部分代码:

 for (int i = 0; i < pix.length; i++){
     int tmp = i;
     pix[i].addMouseListener(new MouseAdapter() {
         public void mouseClicked(MouseEvent e) {
             setState(Frame.ICONIFIED);
             GlobalScreen.addNativeMouseListener(new NativeMouseAdapter(){
                 public void nativeMouseClicked(NativeMouseEvent e){
                     pixelChoose(pix[tmp]);
                     setState(Frame.NORMAL); 
                 }
            }); 
        }
    });

P.S.:我试过用

GlobalScreen.removeNativeMouseListener(new NativeMouseAdapter() {
    public void nativeMouseClicked(NativeMouseEvent e) {

    }
});

但实际上并不知道如何正确使用它。

P.S.[2]:如果您对该问题有其他解决方案,欢迎您将其输入到答案中 - 这会很棒:>

编辑! 我很忙,现在我在这里找到解决方案:

NativeMouseAdapter adapter = new NativeMouseAdapter(){
    public void nativeMouseClicked(NativeMouseEvent e){
          pixelChoose(pix[tmp]);
          setState(Frame.NORMAL);
          GlobalScreen.removeNativeMouseListener(this);
    }
};
MouseListener listener = new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
          setState(Frame.ICONIFIED);
          GlobalScreen.addNativeMouseListener(adapter);
    }
};
pix[i].addMouseListener(listener);

【问题讨论】:

  • 您需要引用您最初添加的匿名 NativeMouseAdapter。
  • @matt,怎么样?你能举个例子吗?

标签: java swing jframe listener


【解决方案1】:

添加(在 setState 之后)删除 MouseListener 的代码。

 setState(Frame.NORMAL); 
 for (int i = 0; i < pix.length; i++){
     pix[i].removeMouseListener(MouseAdapter::this); 
 }

pix 必须是最终的,我希望 MouseAdapter::this 适用于匿名 MouseListener。


MouseAdapter::这失败了

代替

 pix[i].addMouseListener(new MouseAdapter() {

将 MouseListener 保存在自己的变量中:

 MouseListener cat = new MouseAdapter() { ... };
 pix[i].addMouseListener(cat);

稍后在内部回调中做

      pix[i].removeMouseListener(cat); 

【讨论】:

  • 更正了答案。
  • 谢谢,从我这里伸出手指)这将在未来有用。
【解决方案2】:

在你创建鼠标监听器的代码中,你需要保留一个引用。

NativeMouseAdapter adapter = new NativeMouseAdapter(){
             public void nativeMouseClicked(NativeMouseEvent e){
                 pixelChoose(pix[tmp]);
                 setState(Frame.NORMAL); 
      }
}
GlobalScreen.addNativeMouseListener(adapter); 

然后当你想删除它时,你使用那个引用。

GlobalScreen.removeNativeMouseListener(adapter);

【讨论】:

  • 你是伙伴 :) 感谢 cmets 中最快的答案和非常有用的代码部分!大手指给你:)
  • 但是如何参考数组元素创建鼠标监听器?像素选择(像素 [tmp]); - tmp 未识别...我必须在循环中创建侦听器吗?
  • 它给你的错误是什么,应该和你之前的方法一样。您可能必须明确将 tmp 声明为 final。 IE。 final int tmp = i
  • 有什么方法可以在他工作后移除监听器?如果它不能放在这里,请张贴作为答案。不明白...添加然后删除 - 结果为零,导致程序在单击获取时不等待...(
  • 你想移除 'nativeMouseClicked` 方法中的监听器?
【解决方案3】:
NativeMouseAdapter adapter = new NativeMouseAdapter(){
    public void nativeMouseClicked(NativeMouseEvent e){
          pixelChoose(pix[tmp]);
          setState(Frame.NORMAL);
          GlobalScreen.removeNativeMouseListener(this);
    }
};
MouseListener listener = new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
          setState(Frame.ICONIFIED);
          GlobalScreen.addNativeMouseListener(adapter);
    }
};
pix[i].addMouseListener(listener);

【讨论】:

    猜你喜欢
    • 2017-02-02
    • 1970-01-01
    • 2012-09-14
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多