У меня есть собственный редактор ячеек, который проверяет, является ли введенное значение числом, а его длина равна 3.
Сейчас я могу убедиться, что при вводе недопустимого значения текущая ячейка остается редактируемой и фокус не перемещается в следующую ячейку.
Но когда введено правильное значение, текущая ячейка все еще остается редактируемой, и один только фокус перемещается к следующей ячейке.
Кроме того, комментируемая часть показа предупреждения также не работает. Целое приложение зависает, и я полагаю, что подсказка идет в фоновом режиме.
Ниже приведен код редактора
public class DepartmentCellEditor extends DefaultCellEditor{
public DepartmentCellEditor()
{
super( new JTextField() );
}
public boolean stopCellEditing()
{
JTable table = (JTable)getComponent().getParent();
try
{
boolean isValid = true;
String s = getCellEditorValue().toString();
if ( s.length() == 3 ) {
for ( int i = 0; i < s.length(); i++ ) {
if ( !Character.isDigit( s.charAt( i ) ) ) {
isValid = false;
break;
}
}
} else {
isValid = false;
}
if ( !isValid ) {
JTextField textField = (JTextField)getComponent();
textField.setBorder(new LineBorder(Color.red));
textField.selectAll();
textField.requestFocusInWindow();
/*JOptionPane.showMessageDialog(
null,
"Please enter a 3 digit number.",
"Alert!",JOptionPane.ERROR_MESSAGE);*/
} else {
JTextField textField = (JTextField)getComponent();
textField.setBorder(new LineBorder(Color.black));
}
return isValid;
}
catch(ClassCastException exception)
{
JTextField textField = (JTextField)getComponent();
textField.setBorder(new LineBorder(Color.red));
textField.selectAll();
textField.requestFocusInWindow();
return false;
}
}
public Component getTableCellEditorComponent(
JTable table, Object value, boolean isSelected, int row, int column)
{
Component c = super.getTableCellEditorComponent(
table, value, isSelected, row, column);
((JComponent)c).setBorder(new LineBorder(Color.black));
return c;
}
}