Предотвратить перерисовку окна при сворачивании

Можно ли остановить программу, перерисовывающую панель, когда программа свернута? * Используемые качели


person Chris Mowbray    schedule 07.03.2012    source источник
comment
Используя какой фреймворк? Качать? АВТ? SWT? Другой?   -  person Ted Hopp    schedule 07.03.2012
comment
Почему это имеет значение, если происходит перекраска? Это заставляет меня подозревать, что под этим скрывается более серьезная проблема, например, наличие программной логики в вашем методе paint или paintComponent.   -  person Hovercraft Full Of Eels    schedule 07.03.2012
comment
В моей программе есть поток, который вызывает перерисовку каждую 1 секунду, которая перерисовывает график, имитирующий баланс банковского счета. если я перерисую, когда не должен, это сбивает график   -  person Chris Mowbray    schedule 07.03.2012
comment
filedropper.com/assigment31   -  person Chris Mowbray    schedule 07.03.2012
comment
@Chris все зависит от типа исполнителя или таймера   -  person mKorbel    schedule 07.03.2012
comment
В вашем файле JAR нет исходного кода. Что еще более важно, я проделал некоторую основную работу, пытаясь помочь вам в этой теме: графический график -выпуск с демонстрационной программой, а вы не ответили. Что с этим?? Я чувствовал, как будто я потратил впустую много времени с этим. Это не способ мотивировать людей помочь вам узнать больше.   -  person Hovercraft Full Of Eels    schedule 07.03.2012
comment
Мне очень жаль, чувак, я думал, что ответил: / помощь была очень признательна :)   -  person Chris Mowbray    schedule 07.03.2012
comment
@HovercraftFullOfEels вы не можете выполнить файл .jar   -  person Chris Mowbray    schedule 07.03.2012
comment
Конечно, можно выполнить, но источник — это все. Без исходного кода мы понятия не имеем, почему ваше приложение ведет себя так, как оно себя ведет.   -  person Hovercraft Full Of Eels    schedule 07.03.2012
comment
Я знаю, что просто показывал, в чем проблема, у меня возникли проблемы с пониманием того, какое отношение класс таймера имеет к перерисовке JFrame.   -  person Chris Mowbray    schedule 07.03.2012
comment
Если вы возьмете мою примерную программу из моего предыдущего вопроса, сделаете Timer окончательной локальной переменной и добавите WindowListener или WindowAdapter в JFrame, вы увидите решение.   -  person Hovercraft Full Of Eels    schedule 08.03.2012


Ответы (2)


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

private static void createAndShowGui() {
  ShowGraph showGraphPanel = new ShowGraph(MAX_POINTS);
  TimerListener timerListener = new TimerListener(MAX_POINTS, showGraphPanel);

  JFrame frame = new JFrame("TestShowGraph");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.getContentPane().add(showGraphPanel);
  frame.pack();
  frame.setLocationByPlatform(true);
  frame.setVisible(true);

  // Timer now made a final variable so it can be referred to
  final Timer timer = new Timer(TIMER_DELAY, timerListener);
  timer.start();

  frame.addWindowListener(new WindowAdapter() {

     @Override
     public void windowOpened(WindowEvent arg0) {
        timer.start();
     }

     @Override
     public void windowIconified(WindowEvent arg0) {
        timer.stop();
     }

     @Override
     public void windowDeiconified(WindowEvent arg0) {
        timer.start();
     }

     @Override
     public void windowActivated(WindowEvent arg0) {
        timer.start();
     }
  });
}
person Hovercraft Full Of Eels    schedule 07.03.2012

Настоящая проблема, я думаю, заключается в приостановке циклов анимации и т.п. при сворачивании. Если вы используете JFrame, вы можете обнаружить события минимизации окна с помощью:

myFrame.addWindowStateListener(
    new WindowStateListener() {
        @Override
        public void windowStateChanged(WindowEvent evt) {
            if (myFrame.getState() == Frame.ICONIFIED) {
                // suspend painting/animation loops
            } else {
                // resume or continue painting/animation loops
            }
        }
    }
);
person Ted Hopp    schedule 07.03.2012
comment
@Chris: посмотрите на методы, доступные для таймеров Swing. Вы поймете это. - person Hovercraft Full Of Eels; 07.03.2012
comment
@Chris - Если ваша анимация управляется javax.swing.Timer, вы можете просто вызвать методы таймера stop() и start(), чтобы приостановить/возобновить анимацию. Пример кода см. в статье Threads and Swing. . - person Ted Hopp; 07.03.2012
comment
Пример, связанный с Timer, здесь. - person trashgod; 07.03.2012
comment
@TedHopp я знаком с этими методами, так как использовал их в этой программе на кнопках запуска и остановки в файле jar выше. - person Chris Mowbray; 07.03.2012
comment
@Chris - Так почему ты не можешь просто использовать их, чтобы приостановить и возобновить рисование? Легко использовать объект Timer для управления анимацией, как показывает ссылка в моем предыдущем комментарии. - person Ted Hopp; 07.03.2012
comment
@TedHopp Кадр всегда отображается по какой-то причине, он никогда не достигает другого, когда я сворачиваю - person Chris Mowbray; 08.03.2012
comment
@Chris - я изменил логику проверки состояния окна. Посмотрите, обеспечивает ли использование getState() лучшее поведение. - person Ted Hopp; 08.03.2012
comment
@TedHopp Я использовал .getExtendedState() == frame.ICONIFIED, я думаю, что это работает, я объявил свой таймер в другом классе, как я могу вызвать этот таймер для остановки и запуска из класса JFrame, в котором я сейчас нахожусь? - person Chris Mowbray; 08.03.2012
comment
@Chris Вам нужно либо сделать таймер видимым для кода JFrame, либо предоставить методы в другом классе для передачи запросов запуска / остановки таймеру. (Я бы рекомендовал последнее.) - person Ted Hopp; 08.03.2012
comment
@TedHopp Спасибо за вашу помощь, я сделал это, и я не думаю, что это решило мою проблему, все равно спасибо - person Chris Mowbray; 08.03.2012