【发布时间】:2013-12-27 20:23:36
【问题描述】:
我有一个Gui 和一个Game 课程,但我无法从游戏中更新 gui。我没有使用线程,但我以前见过它更新,所以这不是问题。游戏逻辑真的很简单,不需要线程。不管我怎么叫repaint()和revalidate(),现在不管我把它放在哪里都不管用。
class Gui {
//...
public Gui(Game game) {
this.game = game;
initialize();
}
private void initialize() {
//...
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
okAction(textField.getText());
textField.setVisible(false);
okButton.setVisible(false);
textField.setText("");
}
});
}
private void okAction(String input) {
game.receiveInput(input);
}
public void output(String msg) {
textArea.append(msg + "\n");
}
public void getInput() {
textField.setVisible(true);
okButton.setVisible(true);
textField.setText("");
}
}
我还希望能够将String 传递回游戏实例。我想我会在游戏中调用getInput(),它会显示JTextField 用于输入,JButton 用于提交。在actionPerformed() 方法中,我只需要输入文本,然后在游戏类中调用一个方法。我不知道这是否可行,因为 gui 没有更新,而且我从未出现过输入字段和按钮。是这样吗?
这将是 gui “回调”的方法:
class Game {
//...
public void receiveInput(String input) {
int n = Integer.parseInt(input);
if ( validInput(input, actualDecision.choices.size()) ) {
parser.setAction(actualDecision.choices.get(n-1).action);
}
}
}
在游戏课上,我只想打几次gui.output()和gui.getInput()。
我的问题在哪里?为什么它不更新,也不冻结?如果我使用调试器,output() 和 getInput() 都会被执行,但没有任何反应......
编辑:
好的,我自己发现了一个问题,获取输入部分...由于它返回很快,它永远无法接收输入。但这并不能解释为什么没有显示输入字段和按钮,或者没有显示任何文本
编辑 2:
天哪,对不起,我真的不知道如何让它更短,但你只需要看看Game 和Gui,其他的就在那里编译。
代码:https://gist.github.com/anonymous/53bad714592792316b4d
要测试的 xml:https://gist.github.com/anonymous/30b56facb78fe6ecd482
【问题讨论】:
-
您应该在 EDT 线程中进行 GUI 操作。
-
@RossDrew 假设所有逻辑都可以在“tick”内完成(多长时间;1/60 秒是理想的)不需要线程
-
您也可以发布 gui.output() 吗?最好作为一个完整的(小)程序
-
假设,出于未知原因,
Game类的receiveInput(String input)函数永远不会被调用。现在向我们展示调用代码:无论您将它们放在哪里。做一个SSCCE -
@RossDrew 实际上是正确的。理查德我写了一个答案,反映了 EDT 机制和this answer with linked documentation 中的
SwingUtilities类。想看的可以去看看。
标签: java swing user-interface