Изменение цвета графического объекта Java - PullRequest
0 голосов
/ 24 ноября 2011

Я пытаюсь прошить графический объект Java, изменив цвет и вызвав метод repaint(). Цвет обновляется только с последним изменением цвета вызова. Вот мой код:

public void start() {
    try {
        Color origColor = node.getColor();
        for (int i=0; i<noOfFlashes; i++) {
            Manager.gui.getDrawGraph().changeNodeColor(node, Color.WHITE);
            Thread.sleep(500);
            Manager.gui.getDrawGraph().changeNodeColor(node, origColor);
            Thread.sleep(500);
        }
        Manager.gui.getDrawGraph().changeNodeColor(node, Graph.VISITED_NODE);       
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

и метод изменения цвета узла:

public void changeNodeColor(Node node, Color c) {
    node.setColor(c);
    repaint();
}

Цвет узла изменения находится в том же классе, что и у компонента рисования.

Любая помощь будет высоко ценится.

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

Исходя из того, что я понимаю из вашего кода, я, вероятно, рекомендую использовать SwingWorker .

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

1 голос
/ 24 ноября 2011

Вам нужно использовать отдельный поток для управления вашим событием GUI.Вы можете сделать это, используя SwingWorker , как предложено Amine, или реализовать интерфейс Runnable , или расширить класс Thread , разработав метод run()Это задача вашего потока.

Вы можете прочитать этот старый вопрос о SO: Как использовать SwingWorker в Java?

Учебное пособие по SwingWorker: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

Учебное пособие для создания темы: http://docs.oracle.com/javase/tutorial/essential/concurrency/

Цвет обновляется только после последнего вызова изменения цвета.

Если выне используйте отдельный поток, ваш графический интерфейс будет зависать до тех пор, пока метод не будет полностью выполнен, и вы не увидите изменения цвета, разделенные Thread.sleep(500);.

ОБНОВЛЕНИЕ

В этой ссылке, в абзаце Почему графический интерфейс Swing зависает или блокируется? , вы можете понять, почему Java Swing GUI зависает, с использованием одного потока.

Проверьте также эту официальную ссылку, в пункте Создание тем , и эта страница, которая возвращает:

Однопоточное правило Swing гласит, что компоненты Swing могут быть доступны только одному потоку.Это правило применяется как к получению, так и к установке, и один поток известен как поток события-отправки.

Правило однопоточности хорошо подходит для компонентов пользовательского интерфейса, поскольку они, как правило, используются в однозадачном режиме.в любом случае, с большинством действий, инициируемых пользователем.Кроме того, создавать безопасные для нитей компоненты сложно и утомительно: это хорошая вещь, которую нельзя делать, если этого можно избежать.Но при всех своих преимуществах правило однопотоковости имеет далеко идущие последствия.

Компоненты Swing, как правило, не будут соответствовать правилу однопоточности, если все их события не отправляются и не принимаются в потоке диспетчеризации событий.Например, события изменения свойства должны отправляться в потоке отправки событий, а события изменения модели - в потоке отправки событий.

Для компонентов на основе модели, таких как JTable и JTree,Правило однопоточности подразумевает, что доступ к самой модели возможен только из потока событий.По этой причине методы модели должны выполняться быстро и никогда не должны блокироваться, иначе весь пользовательский интерфейс будет не отвечать.

Я думаю, что приведенные выше предложения очень полезны для лучшего понимания пакета Swing.

Я сообщаю о предложении trashgod.

Вы можете использовать класс Timer из пакета javax.swing.Timer.Это тоже хорошая альтернатива.

В этом вопросе trashgod сообщает несколько примеров Timer.

Проверьте здесь для учебника о Timer.

0 голосов
/ 24 ноября 2011

Я не уверен, какой фреймворк вы здесь используете ... но вам может понадобиться repaint () как раз перед Thread.sleep (). Возможно, есть Manager.gui.repaint ()? (Извините, полное предположение здесь ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...