• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableのセルの編集をコミット
#navi(../)
*JTableのセルの編集をコミット [#bb49aeec]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2007-04-16~
更新日:&lastmod;

#contents

**概要 [#e5533a8a]
セルの編集中、フォーカスが別のコンポーネントに移動した場合、その編集を確定する方法をテストします。

#screenshot

**サンプルコード [#lc14b0a2]
#code{{
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);

DefaultCellEditor dce = (DefaultCellEditor)table.getDefaultEditor(Object.class);
dce.getComponent().addFocusListener(new FocusAdapter() {
  public void focusLost(FocusEvent e) {
    if(!focusCheck.isSelected()) return;
    if(table.isEditing()) {
      table.getCellEditor().stopCellEditing();
    }
  }
});

table.getTableHeader().addMouseListener(new MouseAdapter() {
  public void mousePressed(MouseEvent e) {
    if(!headerCheck.isSelected()) return;
    if(table.isEditing()) {
      table.getCellEditor().stopCellEditing();
    }
  }
});
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#rf7adb29]
デフォルトのJTableの場合、タブキー、リターンキー、マウスのクリックなどで、別のセルにフォーカスが移動した場合、編集が確定しますが、別のコンポーネントにフォーカスが移っても編集は確定しません。

-table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);とすると、
--同じフレームを親に持つコンポーネントにフォーカスが移動したとき、編集が確定するようになります。
--別フレームのコンポーネントにフォーカスが移動しても編集中のままです。
--ヘッダをクリック、入れ替え、サイズ変更すると、編集はキャンセルされます。

-DefaultCellEditorからエディタコンポーネントを取得し、FocusListenerを設定して、セルが編集中ならtable.getCellEditor().stopCellEditing();とすると、
--別フレームのコンポーネントにフォーカスが移動したときも、編集が確定するようになります。
--ヘッダをクリック、入れ替え、サイズ変更すると、編集はキャンセルされます。

-TableHeaderにMouseListenerを設定して、セルが編集中ならtable.getCellEditor().stopCellEditing();とすると、
--ヘッダをクリックしたとき、編集が確定するようになります。

ヘッダのリサイズモデルがJTable.AUTO_RESIZE_OFFの場合、フレームのリサイズしてもセルは編集中のままですが、JTable.AUTO_RESIZE_ALL_COLUMNSなどの場合は、ヘッダのサイズが変更するため、キャンセル扱いになるようです。
ヘッダのリサイズモデルがJTable.AUTO_RESIZE_OFFの場合、フレームのリサイズしてもセルは編集中のままですが、JTable.AUTO_RESIZE_ALL_COLUMNSなどの場合は、ヘッダのサイズが変更するため、キャンセル扱いになるようです。ヘッダカラムのリサイズでも、編集が確定するようにしたい場合は、以下のように、JTable#columnMarginChangedメソッドなどをオーバーライドする方法があります。
#code{{
table = new JTable(sorter) {
  public void columnMarginChanged(ChangeEvent e) {
    if(table.isEditing()) {
      table.getCellEditor().stopCellEditing();
    }
    super.columnMarginChanged(e);
  }
};
}}


//**参考リンク
**コメント [#l4f43e84]
#comment