簡體   English   中英

Thread.sleep()有時不起作用

[英]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根本不會更新。 您需要使用SwingWorkerSwingTimer類的東西將更新存儲到另一個線程中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM