Отформатируйте ячейку Jtable, если неверный формат, то ничего не делайте
Скажем, у меня есть следующие столбцы в моей Jtable:
{"Item", "Price"}
Я хочу отформатировать столбец цены в формате "0,00". Но если пользователь введет недопустимую строку, сохраните исходное значение ячейки. Например, когда цена равна "1.23", но когда пользователь хочет ввести "abc", ячейка должна быть "1.23".
Как я мог это сделать?
Спасибо
4 ответа
Давайте разделим вашу большую проблему на более мелкие.
Во-первых, вы хотите иметь предметы вашего Price
столбец для отображения в соответствии с указанным форматом, который вы можете достичь с помощью TableCellRenderer
(который при рендеринге чисел будет использовать NumberFormat
для отображения правильного количества десятичных знаков). Поскольку в вашей таблице только два столбца разных типов, самое простое решение - использовать JTable#setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer)
, Таким образом, ваши номера всегда будут отображаться с правильным количеством десятичных знаков.
Во-вторых, для вашей редакции то же решение может быть довольно элегантным: call JTable#setDefaultEditor(java.lang.Class, javax.swing.table.TableCellEditor)
и установите в качестве редактора компонент, который, прежде чем вносить изменения в вашу табличную модель, будет гарантировать, что новое значение является действительным числом (действительным, конечно, в соответствии с вашими правилами).
JTable поддерживает это по умолчанию. Таблица выберет рендерер / редактор на основе данных, хранящихся в каждом столбце. Поэтому все, что вам нужно сделать, это переопределить метод getColumnClass(...) для возврата Double.class. Затем при редактировании ячейки редактор убедится, что введенное значение является действительным числом.
Если вы хотите больше контролировать форматирование номера, вы можете использовать Table Format Renderer.
JFormattedTextField
работает так, как вы описываете, так что просто создайте новый CellEditor
это расширяет JFormattedTextField
,
Поместите команду форматирования в блок try/catch. Если операция не удается с NumberFormatException
Отмените редактирование.
Используя свой оригинальный код, внесите несколько незначительных изменений:
public void setValue(Object value) {
NumberFormat formatter = new DecimalFormat("0.00");
String s = null;
try {
s = formatter.format(Integer.parseInt((String)value));
if (null != s) setText(s);
} catch (NumberFormatException ex) {
// what could I do here?
// You could display a warning JOptionPane and/or output to System.out
}
}