Можно ли остановить программу, перерисовывающую панель, когда программа свернута? * Используемые качели
Предотвратить перерисовку окна при сворачивании
Ответы (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
@Chris: посмотрите на методы, доступные для таймеров Swing. Вы поймете это.
- person Hovercraft Full Of Eels; 07.03.2012
@Chris - Если ваша анимация управляется
javax.swing.Timer
, вы можете просто вызвать методы таймера stop()
и start()
, чтобы приостановить/возобновить анимацию. Пример кода см. в статье Threads and Swing. .
- person Ted Hopp; 07.03.2012
@TedHopp я знаком с этими методами, так как использовал их в этой программе на кнопках запуска и остановки в файле jar выше.
- person Chris Mowbray; 07.03.2012
@Chris - Так почему ты не можешь просто использовать их, чтобы приостановить и возобновить рисование? Легко использовать объект
Timer
для управления анимацией, как показывает ссылка в моем предыдущем комментарии.
- person Ted Hopp; 07.03.2012
@TedHopp Кадр всегда отображается по какой-то причине, он никогда не достигает другого, когда я сворачиваю
- person Chris Mowbray; 08.03.2012
@Chris - я изменил логику проверки состояния окна. Посмотрите, обеспечивает ли использование
getState()
лучшее поведение.
- person Ted Hopp; 08.03.2012
@TedHopp Я использовал .getExtendedState() == frame.ICONIFIED, я думаю, что это работает, я объявил свой таймер в другом классе, как я могу вызвать этот таймер для остановки и запуска из класса JFrame, в котором я сейчас нахожусь?
- person Chris Mowbray; 08.03.2012
@Chris Вам нужно либо сделать таймер видимым для кода JFrame, либо предоставить методы в другом классе для передачи запросов запуска / остановки таймеру. (Я бы рекомендовал последнее.)
- person Ted Hopp; 08.03.2012
@TedHopp Спасибо за вашу помощь, я сделал это, и я не думаю, что это решило мою проблему, все равно спасибо
- person Chris Mowbray; 08.03.2012
paint
илиpaintComponent
. - person Hovercraft Full Of Eels   schedule 07.03.2012