如何从mouseListener中逃脱?

时间:2017-11-03 10:40:52

标签: java swing jframe listener

我有:

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

当点击pix [i]时 - JFrame必须图标化,并且在屏幕的任何一点下一次点击必须完全改变textField(pix [i])而不影响另一个textFields,然后框架必须标准化并且之后任何鼠标点击(不在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]:如果您对该问题有另一种解决方案,欢迎您将其输入答案 - 它会很棒:&gt;

修改<!/强> 我很吵,现在我在这里解决方案:

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);

3 个答案:

答案 0 :(得分:1)

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

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

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

MouseAdapter ::此失败

而不是

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

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

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

后来在内部回调做了

      pix[i].removeMouseListener(cat); 

答案 1 :(得分:0)

在您创建鼠标侦听器的代码中,您需要保留引用。

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

然后,当您想要删除它时,使用该引用。

GlobalScreen.removeNativeMouseListener(adapter);

答案 2 :(得分:0)

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);