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