【问题标题】:How can I get the value out of a run method?如何从运行方法中获取价值?
【发布时间】:2019-12-20 14:04:42
【问题描述】:

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

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

  2. 按钮打开第二帧,第二帧包含计时器对象。现在我可以通过再次单击按钮来关闭第二帧。但是当计时器将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


【解决方案1】:

一个简单的解决方法是将timerClass.x == 3检查移到计时器类中:

在课堂FrameTwo 替换:

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

timerClass = new TimerClass(()->this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)));

TimerClass类中替换构造函数:

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);
        }

【讨论】:

  • 哇。那是一个快速的答案。谢谢你。过去我经常使用 Runnable 这个词。那究竟是什么? ** new TimerClass()** 中的 ()-> 是什么意思?是对 Runnable 的引用吗?
  • 对不起。我是论坛的新手。下次我会尝试更好地降价我的 cmets。但是编辑的时间已经结束了。
  • Runnable 只是一个带有一种方法(运行)的接口。 ()->this.dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)) 只是写 new Runnable() { @Override public void run() { FrameTwo.this.dispatchEvent(new WindowEvent(FrameTwo.this, WindowEvent.WINDOW_CLOSING)); } } 的更短方式
  • 这就像事先创建一个方法,然后将该方法交给 TimerClass 以在 x==3 时调用它。
  • 哇。非常感谢。它对我有很大帮助。如果我有不允许参数的方法或处理匿名静态方法时,我可以一直这样使用它吗?
猜你喜欢
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2021-02-01
  • 2020-08-12
相关资源
最近更新 更多