Я пытаюсь создать текстовую игру с графическим интерфейсом пользователя на Java, и мне нужно использовать SwingWorker. Однако я не понимаю ни одного из руководств, и для меня это просто не имеет смысла :(.

public void write(String msg){
    int i=0;
    while(true){
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        console.setText(console.getText()+ msg.charAt(i));
        if(i==msg.length()){
            console.setText(console.getText()+ newline);
            break;
        }
    }
}

По сути, я пытаюсь передать строку методу и распечатать ее char за char, однако я не могу, поскольку sleep () прерывает EDT и блокирует графический интерфейс для msg.length () * 400 мс :(.

Если у кого-то есть кодовое решение с использованием SwingWorker, я был бы благодарен :)

1
user1906909 24 Дек 2012 в 14:43
Почему вы хотите использовать Swingworker в "текстовой игре" ? Swingworkers предназначены для использования с Swing ...
 – 
assylias
24 Дек 2012 в 14:47
Текстовая игра по-прежнему имеет графический интерфейс.
 – 
user1906909
24 Дек 2012 в 14:49
while(true){ - это бесконечный цикл, я видел там break;, но лучше было бы изменить true на локальную переменную, чтобы лучше помогать быстрее публиковать SSCCE, короткий, работоспособный, компилируемый, почти у меня проблема, JFrame, JTextArea и SwingWorker со значением из Random, на этом форуме есть коды (в форме SSCCE) около 35 - 50 строк об одной и той же проблеме
 – 
mKorbel
24 Дек 2012 в 14:49
Какая проблема у вас с использованием приведенного выше кода? какие проблемы вы обнаружили при вызове этого метода из doInBackground() SwingWorker
 – 
vishal_aim
24 Дек 2012 в 14:50
Проблема в том, что я не знаю, как это сделать с Swingworker. Без Swingworker он просто блокирует графический интерфейс для msg.length () * 400 мс
 – 
user1906909
24 Дек 2012 в 14:53

1 ответ

Лучший ответ

Вы можете попробовать это просто, чтобы понять, как использовать swingworker с некоторой строкой:

public void runInBackgroud(final String msg)
{
    SwingWorker<Object, Object> task = new SwingWorker<Object, Object> ( )
    {
        public Object doInBackground()
        {
            write(msg);
            return null;
        }
        public void done()
        {}
    };
    task.execute ( );
}

И просто вызовите этот метод runInBackgroud(msg);

1
vishal_aim 24 Дек 2012 в 15:03