Swing/CellEditorInputVerifier のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/CellEditorInputVerifier へ行く。
- 1 (2019-08-05 (月) 16:11:33)
- 2 (2021-04-06 (火) 17:42:47)
- category: swing folder: CellEditorInputVerifier title: JTableのセルエディタへの入力を検証する tags: [JTable, CellEditor, InputVerifier, DocumentFilter, JFormattedTextField] author: aterai pubdate: 2019-08-05T16:10:21+09:00 description: JTableのセルエディタへの入力が妥当かをInputVerifierなどを使用して検証します。 image: https://drive.google.com/uc?id=1a1Hfeov5wRU2B59t5ea3zVRm8m-6PkLW
概要
JTable
のセルエディタへの入力が妥当かをInputVerifier
などを使用して検証します。
Screenshot
Advertisement
サンプルコード
TableModel model = new DefaultTableModel(columnNames, 10) {
@Override public Class<?> getColumnClass(int column) {
return Integer.class;
}
};
JTable table = new JTable(model) {
@Override public Component prepareEditor(TableCellEditor editor, int row, int column) {
Component c = super.prepareEditor(editor, row, column);
((JComponent) c).setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
return c;
}
};
JTextField textField2 = new JTextField();
textField2.setInputVerifier(new IntegerInputVerifier());
table.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(textField2) {
@Override public boolean stopCellEditing() {
JComponent editor = (JComponent) getComponent();
boolean isEditValid = editor.getInputVerifier().verify(editor);
editor.setBorder(isEditValid ? BorderFactory.createEmptyBorder(1, 1, 1, 1)
: BorderFactory.createLineBorder(Color.RED));
return isEditValid && super.stopCellEditing();
}
});
View in GitHub: Java, Kotlin解説
Default
- デフォルトの
JTable.NumberEditor
(JTable.GenericEditor
を継承)を使用 - 数値以外を入力し、EnterやTabキーで編集確定を実行するとエディタの縁が赤くなりフォーカス移動がキャンセルされる
- デフォルトの
DocumentFilter
- セルエディタに数値以外の入力を禁止する
DocumentFilter
をAbstractDocument#setDocumentFilter(...)
でメソッドで設定し、TableColumn#setCellEditor(...)で1
列目のセルエディタとして設定
- セルエディタに数値以外の入力を禁止する
InputVerifier
- セルエディタに
InputVerifier
を設定し、TableColumn#setCellEditor(...)で2
列目のセルエディタとして設定 - EnterやTabキーで編集確定する
CellEditor#stopCellEditing()
メソッドを実行したとき、自然数、または空文字以外が入力されている場合はエディタの縁を赤くし、フォーカス移動がキャンセルする
- セルエディタに
JFormattedTextField
- セルエディタに
JFormattedTextField
を設定し、TableColumn#setCellEditor(...)で3
列目のセルエディタとして設定 - Tabキーで編集確定する
CellEditor#stopCellEditing()
メソッドを実行したとき、数値以外が入力されている場合はエディタの縁を赤くし、フォーカス移動がキャンセルする- デフォルトの
JFormattedTextField
の場合、Enterキーの入力でJFormattedTextField
側のInputMap
で定義されたアクションでフォーカス移動がキャンセルされ、CellEditor#stopCellEditing()
は実行されないのでエディタの縁は変化しない
- デフォルトの
- セルエディタに
- ESCでセルエディタの編集をキャンセルしたときエディタの縁が赤のまま残ってしまう場合があるので、
JTable#prepareEditor(...)
メソッドをオーバーライドして縁を初期化JTable table = new JTable(model) { @Override public Component prepareEditor(TableCellEditor editor, int row, int column) { Component c = super.prepareEditor(editor, row, column); ((JComponent) c).setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1)); return c; } };