web-dev-qa-db-ja.com

セルがフォーカスを失うたびに、Jtableはデータを保存できますか?

高レベル:ユーザーがデータを編集するために使用できるJTableがあります。

ユーザーがEnterキーまたはTabキーを押して編集を終了するたびに、データが保存されます(「保存済み」とは、実際には「TableModelのsetValueAt()メソッドが呼び出される」ことを意味します)。

ユーザーが編集後に他の方法でセルを離れた場合、新しいデータは保存されず、値は元の状態のままになります。したがって、たとえば、ユーザーが値を変更してから画面上の他のウィジェットをクリックしても、変更は「固定」されません。

これは、文字列でいっぱいのJTableのデフォルトの動作だと思います。

さまざまな理由から、ユーザーがセルを離れるたびに、セルがすべての編集を保存することが望ましい動作です。 Swingにこれを実行させるための最良/正しい方法は何ですか?

24
Electrons_Ahoy

テーブルの編集停止 何が起こっているのかを説明し、いくつかの簡単な解決策を示します。

26
camickr

フォーカスリスナー を追加する必要があります。 JTableは基本的にそのセルコンポーネントのコンテナであるため、実際には、指定した方法で動作する必要があるテーブル内のすべてのセルのフォーカスリスナーが必要です。

これを行うには、フォーカスリスナーが登録されているセルコンポーネントをラップするカスタムセルエディターを作成する必要があります。また、フォーカス喪失イベントのコールバックを受け取ったら、必要に応じてデータを保存します。

これはあなたがする必要があることのほとんどをかなり詳しく説明しています 。フォーカスリスナーの実装の詳細はありませんが、それはかなり簡単です。

セルコンポーネントとしてJTextComponentを使用するとします。次に:

public void focusLost(FocusEvent e) {
   JTextComponent cell = (JTextComponent) e.getSource();  
   String data = cell.getText();

   // TODO: save the data for this cell
}

[p.s.編集]:

このイベントであなたを呼んでいるスレッドはディスパッチスレッドです。待ち時間の長いアクションには使用しないでください。ただし、ヒープ内のビットを反転するだけの場合は、問題ないはずです。

5
alphazero