2012-02-18 18 views
0

私は、ユーザーが列ヘッダーをクリックしたときにソートされたデータをデータベースからリロードするJTableを持っています。 MainView(JFrame)には、新しいSwingWorkerを作成して開始するGUI要素が含まれています。 SwingWorkerのdoInBackGround()関数は、MainViewのカーソルを待機カーソルに変更します。次にdoInBackground()関数が処理を完了し、doBackground関数を終了する前に、カーソルをデフォルトのカーソルに戻します。JTableでデータを更新するときに待ちカーソルが表示されないのはなぜですか?

ときどきカーソルが表示されますが、しばらくすると、ヘッダーをクリックするたびにカーソルが表示されなくなります。それはおそらく最初の数回動作し、ランダムなようです。

カーソルが表示されるのはなぜですか。他には表示されません。待ちカーソルを設定する特定の方法はありますか? SwingWorkerスレッドまたはMainView GUIスレッドから待機カーソルを設定する必要がありますか?

+3

すぐに役立つように、[SSCCE](http://sscce.org/)を投稿してください。 –

答えて

1

doinbackgroundの前に待機カーソルを設定する必要があります。私は、ワーカースレッドクラスのコンストラクタで、またはexecuteを呼び出す前に、これを行っています。 doneメソッドでカーソルを通常に戻す必要があります。おそらくあなたの問題がどこにあるのでしょうか。 doneメソッドはUIディスパッチスレッドで実行されます。これはUIの更新に使用する必要があります。

doinbackgroundメソッドからguiコンポーネントを更新しないと、このような動作が発生します。私はそれを知らず、同じことをやっていました。混乱する可能性があります。

+0

ありがとう、私はこれを試してみます –

0

データベースを再度呼び出す代わりに、jtableでデータを並べ替えることができます。セットアップはかなり簡単です。 table sorting

+0

私はそれを試しましたが、それは日付でうまくいっていません。私は表示された日付の特定の書式が欲しいし、タイムスタンプで適切な書式でそれらを並べ替えていません。私はまた、この同じ状況が発生している場所でも、待機カーソルを表示するフィルタボタンを持っています。 –

+0

ああ、日付とJTables ...私は私のプログラムで同じことが必要です。通常のオブジェクトではなく、Dateオブジェクトとしてセルを書式設定する必要があります。私は実際にその部分をやり遂げることに慣れていない。私は、その列のテーブルモデルの列クラスをDate.classオブジェクトとして定義するだけだと思います。それはそれを日付値のように扱います。私はそれに慣れていない。 – Logan

+0

ローガン私はそれもやったと信じて、それは仕事をしなかった。私はコードを稼働させていますが、今度はdbを新たに呼び出す必要があります。再テストがあまりにも多くなるため、おそらく変更しないでしょう。 –

0

Oracle's Swing Concurrency pageから:コードの取り扱い

Swingのイベントは、イベント ディスパッチスレッドと呼ばれる特殊なスレッドで実行されます。 Swingメソッドを呼び出すほとんどのコードも このスレッドで実行されます。ほとんどのSwingオブジェクトメソッドは であり、スレッドセーフではないため、これは必要です。複数のスレッドからスレッドを呼び出すと、スレッド の干渉またはメモリの一貫性エラーが発生する可能性があります。 doInBackground()方法について

SwingWorker APIのページのレポート、:

が結果を計算し、またはそうすることができない場合に例外をスローします。

次に、ワーカーからいくつかのタスクを実行し、ワーカースレッドで実行します。

done()方法について

:doInBackgroundメソッド が終了した後、イベントディスパッチスレッド上で実行さ

。デフォルト実装は何もしません。このメソッドをサブクラスで に変更すると、イベント ディスパッチスレッドで完了アクションを実行できます。この方法の 実装内でステータスを照会して、このタスクの結果を確認するか、 このタスクがキャンセルされているかどうかを確認できます。

通常、doInBackground()の作業が完了した後の最終結果を表示するために使用されます。

その後、私はあなたのようなコードを使用してdoInBackground() SwingWorkerの方法 にカーソルを設定すべきだと思う:あなたはでき

public void done() { 
setCursor(Cursor.getDefaultCursor()); 
... 
} 

public Void doInBackground() { 
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
... 
} 

done() SwingWorkerの方法でそれを無効に、とこれらのカーソルメソッドに関するその他の情報は、CursorクラスAPIで検索してください。

Here一部のビジーカーソルコードの例のあるページhereカーソルに関するSOの質問。

+0

:デフォルトカーソルを設定するだけでは十分ではないかもしれません。マウスの位置によっては1つよりも多く、正確にリセットするのは難しいです:http://stackoverflow.com/questions/8830642/cursor-icon-does-not-change-after-trigerring-setcursor-method – kleopatra

+1

間違っていますが、私はgui内のコンポーネントをdoInBackground()メソッドから変更するとこのタイプの問題が発生する可能性があると考えています。 SwingWorkerThreadクラスのコンストラクタを作成してそこにカーソルコードを置くことをお勧めします。ちょうどそれがイベントディスパッチスレッドから行っていることを確認するためです。少なくともそれは私が過去に取ったアプローチです。私たちは皆、私たちがもっと学ぶほどの変化を知っています。 – Logan

+0

@kleopatra清算とリンクをありがとう、私はその問題については知りませんでした。論理的には、OPが、カラムヘッダーをクリックしてSwingWorkerをロードした後にカーソルが表示されることを望むならば、カーソルはdoInBackground()に設定されるべきです。今あなたのリンクで、いくつかの問題があることを知っています: –

関連する問題