【发布时间】:2019-12-20 14:04:42
【问题描述】:
我有两个框架。第一个有一个按钮。单击它会打开第二个框架并启动一个计时器。可以通过再次按下按钮或等待计时器将局部变量x 增加到三来关闭第二帧。我有几种方法。
该按钮仅启动了计时器,并且在计时器的 run 方法中打开了第二帧。当计时器将变量
x增加到三时,第二帧关闭。它工作正常。问题是我无法通过再次按下按钮来关闭框架。所以我尝试了以下方法。按钮打开第二帧,第二帧包含计时器对象。现在我可以通过再次单击按钮来关闭第二帧。但是当计时器将
x增加到三时,它不会关闭,因为第二帧现在不在运行方法中并且无法再访问局部变量x。
这是我的问题。我只是不知道如何从 run 方法中获取 x 的值。 run 方法不允许任何参数传递值。使用timerClass.x 访问它不会改变任何东西。代码在这里。
public class Main {
public static void main(String[] args) {
FrameOne frameOne = new FrameOne ();
}}
.
/////////////////////////////////////// THE FIRST FRAME
public class FrameOne extends JFrame implements ActionListener {
private FrameTwo frameTwo;
private JButton btn= new JButton();
/////////////////////// PROPERTIES OF THE FIRST FRAME
FrameOne(){
btn.addActionListener(this);
add(btn);
setSize(400,400);
setLocation(300, 250);
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
/////////////////////// OPENS THE SECOND FRAME BY CLICKING THE BUTTON
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btn && frameTwo == null) {
frameTwo = new FrameTwo();
}
/////////////////////// CLOSES THE SECOND FRAME BY CLICKING THE BUTTON AGAIN
else if (e.getSource() == btn && frameTwo != null) {
frameTwo.dispatchEvent(new WindowEvent(frameTwo, WindowEvent.WINDOW_CLOSING));
frameTwo = null;
}}
}
.
/////////////////////////////////////// THE SECOND FRAME
public class FrameTwo extends JDialog {
TimerClass timerClass;
FrameTwo() {
setSize(400,400);
setLocation(900, 250);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setVisible(true);
timerClass = new TimerClass(); // starts the timer
////////////////////////// HERE I TRY TO LET THE TIMER CLOSE THE FRAME AT 3 ////////
if(timerClass.x == 3) {this.dispatchEvent(
new WindowEvent(
this, WindowEvent.WINDOW_CLOSING));
}}}
.
////////////////// 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);
}}
还建议我使用frameTwo.dispose(); 而不是this.dispatchEvent 命令。或者使用frameTwo.dispatchEvent等等。没有任何工作。我知道这是因为我对传递变量值不够熟悉。请不要给我使用教程的麻烦。我需要从这个例子中了解它才能快速取得进展。这是我的学习方式。感谢您的同情和努力。
【问题讨论】:
-
@Sandeep Kumar 感谢您的改进。老实说,我尽量少犯错误。我没有意识到它有那么糟糕。
标签: java methods parameters timer local