Swing - 在上一个方法完成之前停止执行一个方法
Swing - Stopping a method from executing until previous method is complete
我正在用 Swing 编写一个 GUI 程序,我在 class 中有以下两种方法:
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;
}
如果使用 'delayed message type',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
完成?
我遇到了 synchronized
选项,但我不是很了解它,不确定它是否可以在这种情况下使用。
有一种方法叫忙等。 Busy Waiting on Wikipedia
这样实现:
创建一个字段,确保已执行 addMessageToLog。
private static boolean ready = false;
如果 addMessageToLog 成功结束,将此字段设置为 true。
private String getCommand(String instruction, String error) {
[...]
ready = true;
return command;
现在你可以像这样使用这个方法了:
private String getCommand(String instruction, String error){
while(!ready){sleep(1);} //Busy waiting
[...]
另一种方法是在 addMessageToLog-Method 中调用 getCommand。
我正在用 Swing 编写一个 GUI 程序,我在 class 中有以下两种方法:
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;
}
如果使用 'delayed message type',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
完成?
我遇到了 synchronized
选项,但我不是很了解它,不确定它是否可以在这种情况下使用。
有一种方法叫忙等。 Busy Waiting on Wikipedia
这样实现:
创建一个字段,确保已执行 addMessageToLog。
private static boolean ready = false;
如果 addMessageToLog 成功结束,将此字段设置为 true。
private String getCommand(String instruction, String error) { [...] ready = true; return command;
现在你可以像这样使用这个方法了:
private String getCommand(String instruction, String error){
while(!ready){sleep(1);} //Busy waiting
[...]
另一种方法是在 addMessageToLog-Method 中调用 getCommand。