Java SwingUtilities.invokeLater - PullRequest
       23

Java SwingUtilities.invokeLater

2 голосов
/ 23 февраля 2011
.addActionListener(new ActionListener(){
        public void actionPerformed (ActionEvent e){
            try{
                ta.append("Searching Initiated at: "+datetime()+"\n");
                gui.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                task.execute();
                javax.swing.SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        gui.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                    }
                });
                //Enable the next stage in the YD process and disable the previously executed functions
                clusAn.setEnabled(true);
                open.setEnabled(false);
                statCl.setEnabled(false);
            }catch (Exception IOE){
                }
        }
    });

Привет, немного болею за последний этап этого приложения, которое я разработал.

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

Task.execute не относится к тому же классу, поэтому я не могу просто выполнить прямой вызов "gui.setCursor", поскольку он не распознает GUI как переменную.

Не уверен, что делать, так что любой совет будет отличным

Спасибо: D

Ответы [ 3 ]

5 голосов
/ 23 февраля 2011

Измените класс задачи так, чтобы он принимал ваш GUI в качестве аргумента конструктора.Таким образом, когда задача завершена, она может вызвать метод setCursor.

Вы должны использовать SwingWorker для такого рода вещей.

РЕДАКТИРОВАТЬ:

Воткаким должен быть код задачи:

public class MySwingWorker extends SwingWorker<Void, Void> {

    /**
     * The frame which must have the default cursor set 
     * at the end of the background task
     */
    private JFrame gui;

    public MySwingWorker(JFrame gui) {
        this.gui = gui;
    }

    // ...

    @Override
    protected void done() {
        // the done method is called in the EDT. 
        // No need for SwingUtilities.invokeLater here
        gui.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }
}
1 голос
/ 23 февраля 2011

Когда вы создаете свою задачу, передайте ей интерфейс, который имеет своего рода «завершенный» метод. Сделайте так, чтобы ваш вызов вызвал этот метод, когда он будет завершен, затем попросите класс GUI реализовать этот интерфейс и изменить курсор на вызове этого метода.

0 голосов
/ 05 марта 2011

Может быть, вы можете попробовать сделать финал графического интерфейса.

final JComponent guiFinal = gui;
javax.swing.SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        guiFinal .setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                    }
                });
...