Java swing-在mouseclicked事件中使用范围外的布尔值?

Java swing-在mouseclicked事件中使用范围外的布尔值?,java,swing,button,mouseevent,actionlistener,Java,Swing,Button,Mouseevent,Actionlistener,您好,我想知道在鼠标点击事件中,您如何通过按钮响应不同的情况。我现在有一些 boolean x = false; btnExample.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent arg0) { . . . 我希望鼠标选中的第一行是一个if语句,用于检查布尔值(x)是否为真/假。我想我的问题是如何访问这个变量(x),因为它必须被标记为final(这不是我想要

您好,我想知道在鼠标点击事件中,您如何通过按钮响应不同的情况。我现在有一些

boolean x = false;
btnExample.addMouseListener(new MouseAdapter() {

    public void mouseClicked(MouseEvent arg0) {
    .
    .
    .
我希望鼠标选中的第一行是一个if语句,用于检查布尔值(x)是否为真/假。我想我的问题是如何访问这个变量(x),因为它必须被标记为final(这不是我想要的,因为我需要更改它)?我会在某个时刻将x改为true

  • 您试图在匿名内部类中使用局部布尔变量,这仅在字段为final时有效,以防止内部类的变量副本不同步。解决方案是将布尔值设为类字段,它将在匿名内部类中可见
  • 在按钮上使用鼠标听筒不是个好主意。改用ActionListener。否则,您的按钮将无法始终按预期运行。例如,禁用该按钮不会像应该的那样使侦听器失活

  • e、 g

  • 您试图在匿名内部类中使用局部布尔变量,这仅在字段为final时有效,以防止内部类的变量副本不同步。解决方案是将布尔值设为类字段,它将在匿名内部类中可见
  • 在按钮上使用鼠标听筒不是个好主意。改用ActionListener。否则,您的按钮将无法始终按预期运行。例如,禁用该按钮不会像应该的那样使侦听器失活

  • e、 g

    1) 使该字段成为匿名类的类字段

    btnExample.addMouseListener(new MouseAdapter() {
        private boolean x = false;
    
        @Override
        public void mouseClicked(MouseEvent arg0) {
           //code here
        }
    }
    
    2) 或者建立一个私人的内部阶级

    private class MyMouseListener extends MouseAdapter {
        private boolean x = false;
    
         //or you can inject via constructor or setter
    
        @Override
        public void mouseClicked(MouseEvent arg0) {
           //code here
        }
    }
    
    3) 或者将
    x
    作为类中的实例变量,但仅当
    x
    在类中使用或变异,而不仅仅是在匿名类中使用或变异时,才建议这样做

    例如:

    public class MyClass {
    
    private boolean x = false;
    
     public MyClass(){
    
      btnExample.addMouseListener(new MouseAdapter() {
    
        @Override
        public void mouseClicked(MouseEvent arg0) {
           x = true;
        }
      }
     }        
    }
    
    1) 使该字段成为匿名类的类字段

    btnExample.addMouseListener(new MouseAdapter() {
        private boolean x = false;
    
        @Override
        public void mouseClicked(MouseEvent arg0) {
           //code here
        }
    }
    
    2) 或者建立一个私人的内部阶级

    private class MyMouseListener extends MouseAdapter {
        private boolean x = false;
    
         //or you can inject via constructor or setter
    
        @Override
        public void mouseClicked(MouseEvent arg0) {
           //code here
        }
    }
    
    3) 或者将
    x
    作为类中的实例变量,但仅当
    x
    在类中使用或变异,而不仅仅是在匿名类中使用或变异时,才建议这样做

    例如:

    public class MyClass {
    
    private boolean x = false;
    
     public MyClass(){
    
      btnExample.addMouseListener(new MouseAdapter() {
    
        @Override
        public void mouseClicked(MouseEvent arg0) {
           x = true;
        }
      }
     }        
    }
    


    为什么x必须标记为最终的?在没有看到更多信息的情况下,我会说在你的课堂上让x成为一个字段。为什么它必须被标记为最终字段?如果我尝试使用x,那么我是如何得到它的,它说它不能引用在不同方法中定义的内部类中的非最终变量。直接回答这个问题:您不能访问其范围之外的变量。在您的情况下使用JToggleButton可能是合理的。为什么x必须标记为最终变量?在没有看到更多信息的情况下,我会说在你的课堂上让x成为一个字段。为什么它必须被标记为最终字段?如果我尝试使用x,那么我是如何得到它的,它说它不能引用在不同方法中定义的内部类中的非最终变量。直接回答这个问题:您不能访问其范围之外的变量。在您的案例中使用JToggleButton可能是合理的。将布尔值设为类字段是什么意思?啊,您的第二点正是我这样做的原因这哈哈,也许我应该用actionlistener。谢谢。@Robert:请看上面的编辑。变量是在类中声明的,而不是在方法或构造函数中声明的。但这仍然不能解决问题。匿名内部类不能引用my main类中的变量,除非它们被标记为final。。“解决方案是将布尔值设为类字段…”类字段指静态字段,我想你的意思是
    实例字段
    将布尔值设为类字段是什么意思?啊,你的第二点正是我这样做的原因。哈哈,也许我应该用actionlistener。谢谢。@Robert:请看上面的编辑。变量是在类中声明的,而不是在方法或构造函数中声明的。但这仍然不能解决问题。匿名内部类不能引用my main类中的变量,除非它们被标记为final。。“解决方案是将布尔值设为类字段..”类字段指的是静态字段,我认为您的意思是
    实例字段
    ,但其他按钮也需要访问此变量。此变量不限于此单鼠标侦听器。@Robert请将其作为实例变量@罗伯特,一点也不!仅当它是局部变量时才标记为final!请参阅我的3个解决方案。第三是你需要的!但其他按钮也需要访问此变量。此变量不限于此单鼠标侦听器。@Robert请将其作为实例变量@罗伯特,一点也不!仅当它是局部变量时才标记为final!请参阅我的3个解决方案。第三是你需要的!