Почему функция isActive() в java работает в Windows и не работает в ubuntu

#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 для обработки неактивного состояния.