【问题标题】:How to get value from constantly changing variable如何从不断变化的变量中获取价值
【发布时间】:2018-08-01 07:47:29
【问题描述】:

我正在创建某种菜单(在摇摆中),这是我的代码

public class JavaApplication5
{
    public static void main(String[] args) 
    {       
        NewJFrame frame = new NewJFrame();
        frame.setVisible(true);

        if(frame.getRunning() == true)
        {
           System.out.println("why it doesn't work");
        }
    }
}

这是我的菜单类:

public class NewJFrame extends javax.swing.JFrame 
{
    public boolean isRunning = false;

    public void setRunning(boolean isRunning)
    {
        this.isRunning = isRunning;
    }

    public boolean getRunning()
    {
        return isRunning;
    }

    public NewJFrame() 
    {
        initComponents(); //this refers to auto-generated code by swing library
    }
    //some swing stuff...

    private void PlayActionPerformed(java.awt.event.ActionEvent evt) {                                     
        this.setRunning(true);
        System.out.println(getRunning());
    }
}

当我点击“播放”按钮时,输出是: “真的 真的 真的”

这里我的问题出现了:为什么在输出的控制台中,如果我将该值从 false 更改为 true(通过按下按钮),以下行不会显示“为什么它不起作用”?如何在主函数中调用那个不断变化的变量?提前致谢。

【问题讨论】:

  • 它将在设置可见框架后直接执行if(),然后您才能执行任何导致将isRunning设置为true的操作。
  • 为什么不:setVisible 只标记组件变为可见,主方法继续执行调用getRunning,此时它不是true - 还没有可见。在后台系统开始显示“菜单”,但主要方法可能长时间终止......即使菜单可见,您也没有时间按下任何按钮。您可以注册一个侦听器(检查`java.beans.PropertyChangeSupport`)以在值更改时调用......或者只使用模式对话框

标签: java swing parameter-passing actionlistener


【解决方案1】:

您的应用程序不会阻塞。它将 JFrame 设置为可见(即显示窗口),然后立即检查是否有frame.getRunning() == true。在评估条件之前点击按钮的可能性绝对为零。

NewJFrame frame = new NewJFrame();
frame.setVisible(true);

// you're assuming the application waits here, but it does not

if(frame.getRunning() == true)
{
    System.out.println("why it doesn't work");
}

解决这个问题的方法是使用同步辅助工具(可能是CountDownLatch),它会阻塞您的主线程,或者重新考虑程序中发生的事件顺序。也许你应该注册一个监听器/回调。

【讨论】:

  • 最好使用监听器(恕我直言)而不是定期检查变量
  • @CarlosHeuberger 同意。我认为“不断检查”变量的问题有一些要求,但我想我一定是编造的。删除那一点,因为是的,我也不会那样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多