Java: setText GUI-код в текстовой RPG-игре - PullRequest
4 голосов
/ 19 февраля 2012

В настоящее время я делаю эту текстовую ролевую игру с простым графическим интерфейсом.Я был рад найти хорошее начало в этом, но потом я наткнулся на кое-что, что заставило меня на некоторое время перестать писать код.

Если вы делаете это в консоли, вы можете легко использовать этот код, чтобы приостановитьдвижения символов на некоторое время, например:

System.out.println("[enemy]");
Thread.sleep(1000);
System.out.println("The local guard waves his sword and tries to stab you in the back, but you quickly parried and tried for a counterattack but you failed.");

Если вы делаете это на JTextArea, вы бы использовали setText, но если вы используете Thread.sleep, это не работает и кодированиеsetText снова стерла бы старый текст и заменила бы его новым текстом, чтобы записи боя не были полностью отображены в игре.Есть ли способ это исправить?

Ответы [ 4 ]

5 голосов
/ 19 февраля 2012

Вы можете использовать append для добавления вместо замены. Это легкая часть.

Сложная часть: вам нужно изменить ход вашей программы. В Swing существует единственный поток для отправки событий GUI, поток для отправки событий. Вы не должны устанавливать EDT на sleep или выполнять другие длительные операции с ним. Это заморозит графический интерфейс, он не сможет ничего ответить и не будет перерисовываться.

Вместо этого вы должны либо запустить новый поток для логического потока и операций диспетчеризации, которые должны быть выполнены в EDT (все, что манипулирует GUI) с SwingUtilities.invokeLater или, в этом случае может быть лучше, SwingUtilities.invokeAndWait.

Или вы должны использовать управляемый событиями поток управления, например Вы можете использовать Timer для вывода второго текста позже.

Поток программ, который хорошо работает с однопоточными консольными программами, не является правильным подходом для многопоточных приложений с графическим интерфейсом (и каждое приложение с графическим интерфейсом автоматически является многопоточным).

2 голосов
/ 19 февраля 2012

для части setText, у вас должна быть переменная, которая будет содержать текст, и когда вы хотите добавить строку, вы добавляете ее и снова устанавливаете текст:

String text ="[enemy]";
textfield.setText(text);
text+= "\nblablabla ..";
textfield.setText(text);

UPDATE:

Некоторые предлагают использовать метод добавления, который является относительно хорошим. Иногда в игре вы хотите добавить, а иногда заменить весь текст (говорит новый персонаж), я бы порекомендовал что-то вроде этого:

textfield.setText("[enemy]\n");
textfield.append("blablabla");

//When someone else wanna talk:

thread.Sleep(1000);
textfield.setText("[me]\n");
textfield.append("moreblablabla");
1 голос
/ 19 февраля 2012

Вы можете использовать append() вместо setText(). Метод append() добавит новый текст в конец старого текста.

1 голос
/ 19 февраля 2012

Вы также можете использовать функцию append () .См. JavaDoc .

jTextField.append("Foo\n");
jTextField.append("Bar\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...