[英]Thread.sleep() Not Working Sometimes
不好意思,我們深感抱歉。 我正在使用JTextPane作為主要文本視圖的游戲。 我使用以下代碼打印到窗格:
public void write(String txt, MessageType t) {
try {
for (char c : txt.toCharArray()) {
text.getDocument().insertString(text.getDocument().getLength(), String.valueOf(c), t.getAttributes());
Utils.pause(30);
}
text.getDocument().insertString(text.getDocument().getLength(), "\n", t.getAttributes());
}
catch (Exception e) { e.printStackTrace(); }
}
該代碼一次寫入每個字符,兩次寫入之間睡眠30毫秒。 然后,它寫一個換行符。 如果您感興趣的話,這里是pause()方法:
public static void pause(int millis) {
try { Thread.sleep(millis); }
catch (InterruptedException e) { e.printStackTrace(); }
}
在大多數情況下,這可以正常工作。 它在每個字符之間插入一些空格,給人以打字的感覺。 但是,在一種情況下它不起作用。
我有一個處理輸入的JTextField。 我添加了此KeyListener:
input.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
CommandParser.getInstance().parse(input.getText());
input.setText("");
}
}
});
在CommandParser的parse()方法的末尾,如果找不到命令,則此行運行:
Game.getInstance().getGUI().write("Invalid command.", GUI.MessageType.BAD);
但是,僅對於該行,程序將等待一秒鍾,然后立即打印所有內容,而不是每30毫秒打印一個字符。 為什么是這樣? 這和內部類有關嗎?
這是因為您的操作是在EDT線程上發生的。 從該方法返回之前,GUI根本不會更新。 您需要使用SwingWorker
或SwingTimer
類的東西將更新存儲到另一個線程中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.