Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GUI不动态更新_Java_Swing_User Interface - Fatal编程技术网

Java GUI不动态更新

Java GUI不动态更新,java,swing,user-interface,Java,Swing,User Interface,我目前正在尝试创建一个程序,当按下JTextArea和JButtons时,动态更改它们上的文本,或者显示JOptionPane。当我按下按钮时,没有任何事情发生,它们没有得到更新,也没有出现对话框 谢谢你的帮助 私有图形用户界面视图; 私人百万富翁模式; 私有字符串问题; 私人智力游戏状态; 私有布尔运算 public MillionaireController(MillionaireGui view, Millionaire model) { this.view = view;

我目前正在尝试创建一个程序,当按下JTextArea和JButtons时,动态更改它们上的文本,或者显示JOptionPane。当我按下按钮时,没有任何事情发生,它们没有得到更新,也没有出现对话框

谢谢你的帮助 私有图形用户界面视图; 私人百万富翁模式; 私有字符串问题; 私人智力游戏状态; 私有布尔运算

public MillionaireController(MillionaireGui view, Millionaire model) {
    this.view = view;
    this.model = model;
    this.question = null;
    this.gameState = 0;
    this.isRunning = true;
}

public void setModel(Millionaire model) {
    this.model = model;
}

public void setView(MillionaireGui gui) {
    this.view = gui;
}

public void getQuestion() {
    question = model.getDeck().generateQuestion();
    view.setQuestion(question);
}
public void update(){
 while(isRunning){

 if(gameState == 0){

    getQuestion();

    ArrayList<String> ans = model.getDeck().getAnswers();
    view.setButtonA(ans.get(0));
    view.setButtonB(ans.get(1));
    view.setButtonC(ans.get(2));
    view.setButtonD(ans.get(3));
    gameState = 1;

}

if(gameState == 1){

    if(view.getAnswer() != 0){
        if(model.getDeck().isCorrect(view.getAnswer())){
            view.dispCorrectAnswer();
            view.setAnswer(0);
                gameState = 0;
        }
        else {
            gameState = 3;
        }
    }

  }
  if(gameState == 3){
      isRunning = false;
      view.displayErrorMsg();
    }
}
}
@Override
public void run() {
  update();
}
}

主要内容:


update()
方法中的代码似乎正在使用线程运行。我认为正在发生的是,您有两个线程,其中一个线程正在执行一些导致更新的后台任务。后台线程不是EDT,因此任何UI更新都不可见

尝试下面的方法可以解决问题(最有可能至少)


以上内容应将您的按钮设置事件放置在EDT上,这将触发更改。

看起来您可能只需要重新验证容器

设置所有按钮文本字段后,调用
gui.revalidate()
将所有内容标记为
无效
验证


另外(正如@npinti所提到的)-我不确定您使用额外的线程到底在做什么,但请注意,在AWT线程之外修改GUI组件是

老实说,我认为您误解了UI的工作方式,似乎是在线性过程中思考。UI是事件驱动的,也就是说,发生了一些事情,您会对此做出响应。你整个“更新”循环只是在meConsider发出“错误”的尖叫,这表明了你的问题。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应您能告诉我们您的控制器在做什么吗?当然,它已在上面更改
setText
是一个绑定字段,也就是说,在调用时,它会自动使自身无效并计划重新绘制,很好的调用-也许这只是多线程的一个问题?感谢您的响应,我们将尝试一下!编辑:刚刚尝试过,但仍然没有响应。我想我得试试swingworker?@user2542424如果像
SwingUtilities
这样的东西不能解决你的问题,那么
swingworker
不太可能解决。您可能需要更改您的设计/方法,以适应框架的事件驱动特性,而不是试图“强制”监视和状态changes@user2542424:请采纳程序员的建议。我认为这将归结为一个设计问题。在JavaUI中,事件是事件驱动的,有一个循环轮询某种程度上的中断。我现在去掉了while循环,所以它所做的就是不断地运行检查。还有什么建议吗appreciated@user2542424:如果将GUI方法包装到
SwingWorker
中,会发生什么情况?
public void setButtonB(String str){
    buttonB.setText(str);
}

public void setButtonC(String str){
    buttonC.setText(str);
}

public void setButtonD(String str){
    buttonD.setText(str);
}

public void setAnswer(int num){
    answer = num;
}

public String getQuestion(){
   return question;
public void setQuestion(String str){
   question = str;
   questionField.setText(str);
}
public class Millionaire_main {

public Millionaire_main(){

}

public static void main(String[] args) {
    MillionaireGui gui = new MillionaireGui();
    QuestionDeck deck = new QuestionDeck();
    Millionaire model = new Millionaire(deck);
    MillionaireController control = new MillionaireController(gui, model);   
    gui.setVisible(true);

    Thread thread = new Thread(control);
    thread.start();
  }
}
SwingUtilities.invokeLater(new Runnable() 
{
    @Override
    public void run() {
        view.setButtonA(ans.get(0));
        view.setButtonB(ans.get(1));
        view.setButtonC(ans.get(2));
        view.setButtonD(ans.get(3));
    }
});