цикл while игнорирует прослушиватель событий - PullRequest
0 голосов
/ 05 декабря 2009

поэтому, когда я запускаю этот код, чтобы попытаться изменить фон, GUI падает и застревает в бесконечном цикле while, игнорируя прослушиватели событий. вот код:

private Panel getPanel1() {
        if (panel1 == null) {
            panel1 = new Panel();
            panel1.setLayout(new GridBagLayout());
            while(frame.isVisible()){
                panel1.addMouseListener(new java.awt.event.MouseAdapter() {
                    public void mouseClicked(java.awt.event.MouseEvent e) {
                        frame.setVisible(false);
                    }
                });
                int r = (int) (Math.random()*255);
                int g = (int) (Math.random()*255);
                int b = (int) (Math.random()*255);
                Color c = new Color(r, g, b);
                panel1.setBackground(c);
                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                panel1.addMouseListener(new java.awt.event.MouseAdapter() {
                    public void mouseClicked(java.awt.event.MouseEvent e) {
                        /*panel1.setVisible(false);
                        frame.setVisible(false);*/
                        System.exit(0);
                    }
                });
            }
        }
        return panel1;
}

вместо выхода из цикла завершения программы или события, меняющего фон, он просто отображает панель и больше ничего не делает, и я вынужден заставить его выйти. что мне делать?

1 Ответ

0 голосов
/ 05 декабря 2009

Вы фактически блокируете поток пользовательского интерфейса, вызывая sleep в цикле. В этом цикле вы также добавляете двух слушателей на каждую итерацию, что довольно странно.

Не блокируйте поток пользовательского интерфейса. Позвольте инфраструктуре GUI позаботиться о доставке событий и т. Д. В основном вам нужно использовать подход к пользовательскому интерфейсу, основанный на событиях, а не тот подход, который вы используете , который никогда не позволит отправлять события (как вы вы никогда не вернете контроль вызывающей стороне).

Создайте панель, добавьте соответствующий прослушиватель событий, а затем просто верните его вызывающей стороне. Если вы хотите менять цвет фона каждые 4 секунды, вы должны сделать это с помощью таймера , чтобы он не блокировал поток пользовательского интерфейса, ожидающий 4 секунды.

...