Мне удалось создать класс пишущей машинки, который по большей части выполняет то, что я хочу.Он будет выводить строку, переданную ему по одному символу за раз, делая паузу между ними, как если бы они были напечатаны, делая паузу немного дольше после периодов.У меня сейчас проблема в том, что когда я использую этот класс, он работает только один раз.Когда я вызываю его дважды (или больше), он пытается запустить их одновременно.Это вызывает серьезные проблемы.Поэтому мне нужен способ запуска первого экземпляра этого класса и каждого последующего, чтобы дождаться «своей очереди» перед запуском.Ниже приведен пример желаемого результата и текущего.
import objectdraw.*; // Where active object comes from.
import javax.swing.JTextArea;
public class Typewriter extends ActiveObject {
private JTextArea out;
private String in;
public Typewriter(String s, JTextArea output) {
in = s;
out = output;
start();
}
public void run() {
synchronized(out) {
for(int i=0; i<in.length(); i++) {
out.append(in.substring(i,i+1));
if(in.charAt(i) == '.') {
pause(30);
} else {
pause(200);
}
}
}
}
}
Текущий:
КОД: новая пишущая машинка ("\ nHello", вывод);новая пишущая машинка ("\ nWorld", вывод);
ТЕКУЩИЙ ВЫХОД
HW ol elr ldo
ЖЕЛАЕМЫЙ ВЫХОД
Hello
World
Очевидно, я пропустил большую часть кода из пишущей машинкиучебный класс.Если это действительно нужно, я могу опубликовать это.Javadocs для ActiveObject можно найти здесь .Вот как меня учили потокам, и я боюсь, что это может быть проблемой.
РЕДАКТИРОВАТЬ:
В ответ ниже я добавил синхронизированную (вне) строку, но яполучить нулевое исключение исключения при попытке запустить код.
Exception in thread "main" java.lang.NullPointerException
at objectdraw.ActiveObject.<init>(ActiveObject.java:239)
at com.caldwellysr.TBA.Typewriter.<init>(Typewriter.java:11)
at com.caldwellysr.TBA.Client.initGame(Client.java:78)
at com.caldwellysr.TBA.Client.<init>(Client.java:66)
at com.caldwellysr.TBA.Client.main(Client.java:24)
Строка 11 пишущей машинки является заголовком конструктора.Клиентская строка 78 - это то, где я вызываю новую пишущую машинку («Тестирование», вывод);где output - строка клиента JTextArea 66 - это вызов initGame (), в котором есть пишущая машинка, строка клиента 24 - это конструктор JFrame.