Я думаю, что самая большая проблема в том, что вы пытаетесь изменить внешний вид графического интерфейса из (я предполагаю) потока, который не является потоком диспетчеризации событий.
Решение состоит в том, чтобы обернуть действие (в частности, вызовы eraseLine
и drawLine
) в Runnable
и вызвать этот Runnable, используя SwingUtilities.invokeAndWait()
.
EDIT : графические компоненты Java на самом деле не позволяют вам самостоятельно управлять холстом. Только компоненты сами делают какие-либо рисунки, и только тогда, когда их призывают рисовать сами. Непосредственное рисование на холсте, даже если бы вы могли заставить его работать, будет плохо работать, потому что вы будете мешать тому, что делает компонент.
Вместо того, чтобы вдаваться в более подробные объяснения, я пошел и реализовал, как мне кажется, «правильный» способ сделать это.
http://pastebin.com/etfmKbjj
Кодирование комментируется там, где это необходимо, надеюсь, оно даст вам некоторые идеи. Для получения дополнительной информации прочтите официальные учебные пособия по Swing и Graphics .
.