Java 如何从run方法中获取值?

Java 如何从run方法中获取值?,java,methods,parameters,timer,local,Java,Methods,Parameters,Timer,Local,我有两个相框。第一个有一个按钮。点击它,第二帧打开,计时器启动。再次按下按钮或等待计时器将局部变量x增加到三,可以关闭第二帧。我有几种方法 该按钮仅启动计时器,在计时器的运行方法中,第二帧被打开。当计时器将变量x增加到三时,第二帧关闭。它工作正常。问题是我无法通过再次按下按钮来关闭框架。所以我尝试了以下方法 按钮打开第二帧,第二帧包含计时器的对象。现在我可以通过再次单击按钮来关闭第二帧。但是,当计时器将x增加到三时,它不会关闭,因为第二帧现在已退出run方法,并且无法访问局部变量x 这是我的问题

我有两个相框。第一个有一个按钮。点击它,第二帧打开,计时器启动。再次按下按钮或等待计时器将局部变量
x
增加到三,可以关闭第二帧。我有几种方法

  • 该按钮仅启动计时器,在计时器的运行方法中,第二帧被打开。当计时器将变量
    x
    增加到三时,第二帧关闭。它工作正常。问题是我无法通过再次按下按钮来关闭框架。所以我尝试了以下方法

  • 按钮打开第二帧,第二帧包含计时器的对象。现在我可以通过再次单击按钮来关闭第二帧。但是,当计时器将
    x
    增加到三时,它不会关闭,因为第二帧现在已退出run方法,并且无法访问局部变量
    x

  • 这是我的问题。我只是不知道如何从run方法中获取
    x
    的值。run方法不允许任何参数传递该值。使用
    timerClass.x
    访问它不会更改任何内容。这是代码

    public class Main {
    
    public static void main(String[] args) {
    
        FrameOne frameOne = new FrameOne ();
    }}
    


    还建议我使用
    frameTwo.dispose()
    而不是
    此.dispatchEvent
    命令。或者使用
    frameTwo.dispatchEvent
    等等。什么都不管用。我知道这是因为我对传递变量值不够熟悉。请不要让我落后于使用教程。我需要从这个例子中了解它,以便快速取得进展。这是我的学习方式。感谢您的同情和努力。

    一个简单的解决方法是将
    timerClass.x==3
    签入timer类,如下所示:

    在class
    FrameTwo中
    替换:

    timerClass = new TimerClass();  // starts the timer
    

    在类
    TimerClass
    中替换构造函数:

    TimerClass(){
    
            timer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    x++;
            }
    
        },0,1000);
    


    @Sandeep Kumar感谢您的改进。老实说,我尽量少犯错误。我没意识到有那么糟糕。这是一个快速的回答。非常感谢。过去我经常用Runnable这个词。那到底是什么?在**new TimerClass()**中()->意味着什么?是指Runnable吗?对不起。我是这个论坛的新手。下次我试着把我的评论写得更好。但是编辑的时间已经过去了。Runnable只是一个带有一个方法(run)的接口
    ()->this.dispatchEvent(new WindowEvent(this,WindowEvent.WINDOW\u CLOSING))
    只是编写
    new Runnable(){@Override public void run(){FrameTwo.this.dispatchEvent(new WindowEvent(FrameTwo.this,WindowEvent.windowu CLOSING));}的较短方法
    这就像预先创建一个方法,然后将该方法提供给TimerClass,以便在x==3.Wow时调用它。非常感谢你。这对我帮助很大。如果我有一个不允许参数的方法,或者当我处理匿名静态方法时,我可以一直这样使用它吗?
    //////////////////       THE TIMER       
    //////////////////       IT INCREMENTS x
    //////////////////       WHEN x = 3 IT SHALL CLOSE THE FRAME 
    
    
    public class TimerClass implements EventListener{
    
                public Timer timer = new Timer(true);
                public int x;
    
        TimerClass(){
    
            timer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    x++;
            }
    
        },0,1000);
    }}
    
    timerClass = new TimerClass();  // starts the timer
    
    timerClass = new TimerClass(()->this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)));
    
    TimerClass(){
    
            timer.scheduleAtFixedRate(new TimerTask() {
                @Override
                public void run() {
                    x++;
            }
    
        },0,1000);
    
    TimerClass(Runnable runWhenThree) {    
                timer.scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        x++;
                        if(x == 3) {
                            runWhenThree.run();
                        }                       
                    }    
                }, 0, 1000);
            }