我有一个Timer类。启动时,它会增加一个整数x。现在,我想从run方法中获取x的值,但不允许使用任何参数。那么如何获得x的值以使用它呢?这里的代码
public class Main {
public static void main(String[] args) {
TimerClass timerClass = new TimerClass();
}}
。
public class TimerClass{
public int x;
public Timer timer = new Timer();
TimerClass(){
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
x ++;
System.out.println(x);
}
},0,500);
}
}
实际的问题是我想尝试更复杂的东西。我有两个框架。第一个有一个按钮。单击时,将打开包含计时器对象的第二帧。再次按下按钮或等待计时器计数到三,即可关闭第二帧。我有几种方法。
按钮仅启动计时器,并且在计时器的运行方法中,第二个框架已打开。计时器递增“ int x”,并且当x = 3时,第二帧正确关闭。问题在于,现在我无法通过再次按下按钮来关闭框架。所以我尝试了以下。
按钮打开第二帧,第二帧包含计时器的对象。现在,我可以再次单击按钮来关闭第二帧。但是,当计时器计数到3时,它将不会关闭,因为第二帧现在不在运行方法中,并且无法再访问计数变量x。
这是我的问题。我只是不知道如何从运行方法中获取“ x”的实际值。用“ 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 DECREMENTS 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,依此类推。没有任何工作。我知道这是因为我对传递变量的值不够熟悉。请不要给我任何使用教程的障碍。我需要从本示例中了解它才能快速取得进展。这是我的学习方式。谢谢您的同情和自负。