Я хочу проверить правильность данных, введенных в ячейку JTable, прежде чем позволить пользователю завершить редактирование.В руководстве Oracle по этой ссылке https://docs.oracle.com/javase/tutorial/uiswing/components/table.html#validtext они звучат очень просто.Выдержка говорит
Автоматическая проверка введенных пользователем строк происходит, когда редактор по умолчанию пытается создать новый экземпляр класса, связанный со столбцом ячейки.Редактор по умолчанию создает этот экземпляр, используя конструктор, который принимает строку в качестве аргумента.Например, в столбце, ячейки которого имеют тип Integer, когда пользователь вводит «123», редактор по умолчанию создает соответствующее Integer, используя код, эквивалентный новому Integer («123»).Если конструктор выдает исключение, контур ячейки становится красным и не позволяет фокусу перемещаться из ячейки.Если вы реализуете класс, используемый как тип данных столбца, вы можете использовать редактор по умолчанию, если ваш класс предоставляет конструктор, который принимает один аргумент типа String.
Чтобы проверить это, я создал простейший случайЯ мог бы подумать, используя этот класс:
class CustomClass {
int value = 0;
public CustomClass(String newValue) throws NumberFormatException {
value = Integer.parseInt(newValue);
if(value<0 || value>100) throw new NumberFormatException("value out of range");
}
public String toString() {return value+"";}
}
Основная идея заключается в том, что если у пользовательского класса есть конструктор с только строкой и метод toString (), он должен работать.Я установил таблицу с CustomClass в качестве типа для первого столбца.Он не дает ожидаемого или желаемого результата.Любая попытка изменить эти ячейки приводит к тому, что ячейка выделяется красным, и редактирование не может быть завершено.Что такое описанное поведение, если введенные данные неверны.Вот что происходит:
Я понимаю, что есть много других способов сделать это.Но этот метод был привлекательным, потому что он давал надежду на использование редактора и средства визуализации по умолчанию с очень небольшим количеством дополнительной работы в пользовательском классе (который мне все равно был нужен).Но, похоже, это не работает так, как рекламируется.Я надеюсь, что будет показано, что это неправильно; -)
Полная программа вставлена ниже.Несколько отпечатков были добавлены, чтобы помочь мне увидеть, что происходит, но они никогда не печатаются в ожидаемое время.То есть кажется, что конструктор и метод toString () не вызываются для проверки и возврата введенного текста.Кто-нибудь знает почему?Спасибо.
-------------- завершенная тестовая программа -------------
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
final public class TestCodeGUI {
private JFrame frame;
private JTable table;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestCodeGUI window = new TestCodeGUI();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public TestCodeGUI() {
initialize();
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 370, 168);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(10, 11, 330, 103);
frame.getContentPane().add(scrollPane);
table = new JTable();
scrollPane.setViewportView(table);
table.setModel(new DefaultTableModel(
new Object[][] {
{new CustomClass("00"), Integer.parseInt("01"), "02"},
{new CustomClass("10"), Integer.parseInt("11"), "12"},
{new CustomClass("20"), Integer.parseInt("21"), "22"},
{new CustomClass("30"), Integer.parseInt("31"), "32"},
},
new String[] {
"Column 0", "Column 1", "Column 2"
}
) {
Class[] columnTypes = new Class[] {
CustomClass.class, Integer.class, String.class
};
public Class getColumnClass(int columnIndex) {
return columnTypes[columnIndex];
}
});
System.out.println("Initialize complete");
}
}
class CustomClass {
int value = 0;
public CustomClass(String newValue) throws NumberFormatException {
System.out.println("CustomClass constructor with \"" + newValue + "\"");
value = Integer.parseInt(newValue);
if(value<0 || value>100) throw new NumberFormatException("value out of range");
}
public String toString() {
String s = value+"";
System.out.println("CustomClass toString returning \"" + s + "\"");
return s;
}
}