Проблемы с меню графического интерфейса Java

statCl.addActionListener(new ActionListener(){
        public void actionPerformed (ActionEvent e) {
            try {
            ta.append("Searching...\n");
            //Do Some stuff, call some classes etc
                ta.append("Search Complete\n");
            } catch (Exception IOE) {}
        }
 });

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

Однако, когда вы нажимаете кнопку, она как бы зависает, пока запускает процессы внутри actionListener и т. д. Затем она в конечном итоге продолжается, закрывает меню и позволяет пользователю продолжить. Проблема в том, что это похоже на сбой программы.

В идеале я хотел бы, чтобы пользователь щелкнул, появился текст «Поиск...», процесс запустился, а затем, когда процесс завершен, он распечатал «Поиск завершен».

Я пробовал перемещать вещи в и из try/catch, я пытался добавить отдельный actionListener для одного и того же элемента, но безуспешно.

Любые идеи будут действительно оценены.


person user585522    schedule 17.02.2011    source источник


Ответы (2)


Вам необходимо использовать SwingWorker.

Все обновления пользовательского интерфейса должны происходить в потоке отправки событий (EDT). Код внутри вашего прослушивателя действий также вызывается в EDT. Это означает, что пока ваш код работает, пользовательский интерфейс не будет обновляться.

Обычный способ справиться с этим — запустить продолжительный код внутри SwingWorker. SwingUtilities Затем .invokeLater можно использовать для того, чтобы ваш долго выполняющийся код вызывал методы для обновления пользовательского интерфейса, что должно происходить в EDT.

person David Sykes    schedule 17.02.2011
comment
Нет необходимости делать уродливый вызов invokeLater(), когда переопределение done() и process() достаточно в 99% случаев. - person josefx; 17.02.2011

Попробуйте использовать SwingWorker.

person Boris Pavlović    schedule 17.02.2011