如何从“ Timer class”运行方法“ public void run(){}”中获取值?

问题描述 投票:-1回答:1

我有一个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);
    }
}
java methods timer parameter-passing runnable
1个回答
0
投票

实际的问题是我想尝试更复杂的东西。我有两个框架。第一个有一个按钮。单击时,将打开包含计时器对象的第二帧。再次按下按钮或等待计时器计数到三,即可关闭第二帧。我有几种方法。

  1. 按钮仅启动计时器,并且在计时器的运行方法中,第二个框架已打开。计时器递增“ int x”,并且当x = 3时,第二帧正确关闭。问题在于,现在我无法通过再次按下按钮来关闭框架。所以我尝试了以下。

  2. 按钮打开第二帧,第二帧包含计时器的对象。现在,我可以再次单击按钮来关闭第二帧。但是,当计时器计数到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,依此类推。没有任何工作。我知道这是因为我对传递变量的值不够熟悉。请不要给我任何使用教程的障碍。我需要从本示例中了解它才能快速取得进展。这是我的学习方式。谢谢您的同情和自负。

© www.soinside.com 2019 - 2024. All rights reserved.