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