1
我写与Swing GUI程序,我有一类以下两种方法:摇摆 - 从执行,直到前面的方法停止的方法是完全
private void addMessageToLog(MessageType type, String message) {
if ((type.equals(MessageType.DELAYED_ERROR)) || (type.equals(MessageType.DELAYED_INFO)) || (type.equals(MessageType.DELAYED_SUCCESS))) {
Timer timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
getModelObserver().createMessage(type, message);
}
});
timer.setRepeats(false);
timer.start();
}
else {
getModelObserver().createMessage(type, message);
}
}
private String getCommand(String instruction, String error) {
String command = "";
while (!isValid(command)) {
addMessageToLog(MessageType.INFO, instruction);
command = getModelObserver().getCommand();
checkCommand(command, error);
}
return command;
}
addMessageToLog
可如果是“延迟加延迟消息类型'被使用。这可以正常工作,但如果我在拨打addMessageToLog
后立即致电getCommand
,那么getCommand
内部的非延迟addMessageToLog
将在先前称为延迟之前执行。
例子:
addMessageToLog(MessageType.DELAYED_INFO, "Delayed message")
getCommand("Not delayed", "Error")
输出:
Not delayed
Delayed message
而我想:
*0.5 second pause*
Delayed message
Not delayed
有没有办法举行的getCommand
直到addMessageToLog
执行完成?
我遇到了选项,但我不太了解它,并且不确定它是否可以在此实例中使用。
请注意,Swing是单线程的,而不是线程安全的,这意味着您不应该因为任何原因(比如调用Thread.sleep)或者在EDT上下文之外更新UI来阻止UI。查看[并发中的Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/)以获取更多详细信息 – MadProgrammer