Периоды c звонков перекрашивать со временем - PullRequest
0 голосов
/ 11 апреля 2020

Итак, у меня есть объект, который расширяет JPanel и отображает точки в матрице с помощью paintComponent. Точки матрицы могут перемещаться, исчезать или умножаться при определенных условиях, и я хочу показать их эволюцию во времени автоматически следующим образом:

for(int i = 0; i < 100; ++i){

    matrix = calculateNextMatrix();    //Calculate possible movements, deaths or births of dots
    myGraphic.updateMatrix(matrix);    //Pass new dots to the JPanel object
    myGraphic.repaint();               //Draw new dots
    Thread.sleep(100);                 //Wait 0.1 seconds for next iteration (yes, this should be in a 
                                       //try-catch)
}

Однако я получаю только последнюю итерацию после l oop завершено, и все предыдущие вызовы repaint () в основном игнорируются. Если я выполняю итерации только по одной за раз (например, с помощью ручного нажатия кнопки), у меня нет проблем.

Есть ли какой-либо способ получить несколько перезаписываемых вызовов periodi c автоматически?

1 Ответ

2 голосов
/ 11 апреля 2020

У меня была проблема с JComponent в моей библиотеке, и я нашел решение с таймером свинга, я сообщил java описание таймера

В общем, мы рекомендуем использовать таймеры Swing, а не таймеры общего назначения для задач, связанных с GUI, поскольку все таймеры Swing совместно используют один и тот же ранее существующий поток таймеров, а задача, связанная с GUI, автоматически выполняется в потоке отправки событий. Однако вы можете использовать таймер общего назначения, если вы не планируете касаться GUI с таймера или вам требуется длительная обработка.

Вы можете использовать таймеры Swing двумя способами:

  • Чтобы выполнить задачу один раз, после задержки. Например, менеджер подсказок инструментов использует таймеры Swing, чтобы определить, когда показывать подсказку, а когда скрывать ее.
  • Для повторного выполнения задачи. Например, вы можете выполнить анимацию или обновить компонент, отображающий прогресс в достижении цели.

Я думаю, что вы находитесь в одном из этих случаев.

Без минимального воспроизводимого примера я могу использовать мой код.

Вы должны создать прослушиватель действий Swing, например:

public class UpdateComponentListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            count += 10;
            timeLabel.setText(count + "");
            //The label call repaint
            //in your app you should be call the repaint

            //In your cases
            /*
                matrix = calculateNextMatrix();    //Calculate possible movements, deaths or births of dots
                myGraphic.updateMatrix(matrix);    //Pass new dots to the JPanel object
                myGraphic.repaint(); 
             */
        }
}

Конструктор таймера входит в введите delay и прослушиватель действий, чтобы вы могли построить свой таймер с помощью этого кода:

Timer timer = new Timer(1000, new UpdateComponentListener());
timer.start();

Вы можете остановить, перезапустить свой таймер, поэтому вы должны установить, насколько правильно таймер.

Пример GUI:

enter image description here

Я написал сообщение и после того, как увидел комментарий @camickr. Я отправляю ответ, потому что моя работа закончена, но комментарий ответил на ваш вопрос.

Я надеюсь, что придется построить пример еды

...