我正在撰写一个简单的游戏应用程序,而且我一直坚持这个问题。
"创建"是一个按钮,位于pmain面板内,这是单击它时执行的操作:
以下是代码:
// ACTION: Create new game
create.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(UA.alreadyOpen()) {
JOptionPane.showMessageDialog(null,"already open game!");
return;
}
int n = 0;
String nome = null;
try {
n = Integer.parseInt(JOptionPane.showInputDialog(null, "Give the max number of guessers"));
nome = JOptionPane.showInputDialog(null, "give the name of the game");
if ( n < 1 || nome == null) System.out.println("mainInterface: input problems"); // TODO ...
frame.setContentPane(pwait);
pwait.setVisible(true);
pmain.setVisible(false);
frame.pack();
} catch (NumberFormatException e1) {
// ???
e1.printStackTrace();
} catch (HeadlessException e1) {
// ???
e1.printStackTrace();
}
// AND HERE IS THE PROBLEM:
if(!UA.apriPartita(n, nome))
System.out.println("ERR creazione partita"); // TODO
refreshPartite();
}
});
UA是此接口类背后的逻辑类。被叫方法&#34; UA.apripartita(..)&#34;工作正常,它做了很多事情。 问题是: 我希望界面重新绘制并在&#34;创建&#34;时显示pwait面板。单击按钮,但它没有返回UA.apripartita(..)的方法返回(我猜,还会返回ActionPerformed函数?)。
实际上,我也试过删除那个UA.apripartita(..)方法调用,它运行正常。 当方法在里面时它为什么不起作用?
提前致谢!
PS。已经尝试过放入一些frame.repaint()或frame.invalidate()但它们似乎什么也没做。
PPS。欢迎任何其他关于此代码的好建议!
答案 0 :(得分:0)
是的,这是设计的。你可以在重拍&#39;的文档中清楚地看到它。 基本上,它坚持&#34;事件&#34;进入swing事件队列 - 处理点击等同一个队列 - 所以Swing将按顺序处理&#34;执行的操作&#34;然后&#34;重新绘制&#34;然后更多的代码片段(例如mouseClicked或其他任何内容)队列)。 这种方法省去了同步的麻烦,特别是考虑到swing组件不是线程安全的。
您可以立即查找&#39; paint&#39;但我真的建议坚持重拍&#39;如果可能的话。
答案 1 :(得分:0)
这是因为actionPerformed(...)
方法在UI主事件线程的控制下运行。因此,在UA.apripartita()
运行时,您的用户界面无法刷新。如果此方法设计为运行很长时间(比如超过半秒,用户不喜欢动作及其效果之间的长时间延迟),您应该考虑使用多线程(如果此方法必须与UI交互,想想SwingWorker
)。