#java #windows #ubuntu
Вопрос:
Почему isActive()
функция работает правильно в Windows и не работает в ubuntu? Я использовал эту функцию в приведенном ниже коде, чтобы заставить программу подождать, пока myFrame
не закроется окно JFrame, и это работало только в Windows.
MyFrame myFrame = new MyFrame(); // This class Extends jFrame to show a Jframe
myFrame.run();
while (myFrame.isActive()) {
sleep(500); // this another function in this class to delay the program for 500 mS
}
Почему это происходит и как с этим бороться !?
Комментарии:
1. Я бы предположил, что нет никакой гарантии, что кадр будет мгновенно активен, как только вы попросите, чтобы его сделали видимым, а не несколько мгновений спустя. Занят-ожидание, пока он станет неактивным, — это плохая модель. Почему бы вам не добавить прослушиватель окна или прослушиватель фокуса окна к нему и не выполнить действие, когда он отключен, закрыт или теряет фокус?
2. @DavidConrad Я понял это. возможно, это связано с тем, что Ubuntu запускает его быстрее, чем windows на моей машине, поэтому он достигает этой строки кода до того, как фрейм становится активным.
3. Более вероятно
setVisible(true)
, что вы, предположительно, имеете в своемrun()
методе блоки в Windows, пока фрейм не активен, и сразу возвращается в Ubuntu, но какова бы ни была причина, ожидание, когда он станет неактивным, является неправильным подходом.4. Не используйте
while
для этого петлю. Используйте список окон .
Ответ №1:
Проблема заключается в вызове isactive
внешнего потока событий. Используйте прослушиватели событий в своем классе MyFrame для обработки неактивного состояния.