JTableのセルエディタへの入力を検証する
Total: 4321
, Today: 2
, Yesterday: 8
Posted by aterai at
Last-modified:
概要
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; } };