2
.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 を変数として認識しないため、「gui.setCursor」を直接呼び出すことはできません。

どうしたらいいのかわからないのでアドバイスいただけると助かります

ありがとう

4

3 に答える 3

5

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));
    }
}
于 2011-02-23T14:01:58.367 に答える
1

タスクを作成するときは、ある種の「完了」メソッドを持つインターフェースを渡します。タスクが終了したらそのメソッドを呼び出してから、GUI クラスにそのインターフェイスを実装させ、そのメソッド呼び出しでカーソルを変更します。

于 2011-02-23T14:00:20.817 に答える
0

たぶん、guiを最終的にしようとすることができます。

final JComponent guiFinal = gui;
javax.swing.SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        guiFinal .setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
                    }
                });
于 2011-03-05T04:35:29.143 に答える