Отформатируйте ячейку Jtable, если неверный формат, то ничего не делайте - PullRequest
1 голос
/ 28 января 2011

Скажем, у меня в Jtable есть следующие столбцы:

{"Item", "Price"}

Я хочу отформатировать столбец цены в формате "0,00".Но если пользователь введет недопустимую строку, сохраните исходное значение ячейки.Например, когда цена равна «1.23», но когда пользователь хочет ввести «abc», тогда ячейка должна быть «1.23»

Как я могу это сделать?

Спасибо

Ответы [ 4 ]

2 голосов
/ 28 января 2011

JTable поддерживает это по умолчанию. Таблица выберет рендерер / редактор на основе данных, хранящихся в каждом столбце. Поэтому все, что вам нужно сделать, это переопределить метод getColumnClass (...) для возврата Double.class. Затем при редактировании ячейки редактор удостоверится, что введенное значение является действительным числом.

Если вы хотите лучше контролировать форматирование номера, вы можете использовать Table Format Renderer .

2 голосов
/ 28 января 2011

Давайте разделим вашу большую проблему на более мелкие.

Во-первых, вы хотите, чтобы элементы вашего столбца Price отображались в соответствии с указанным форматом, чего можно достичь с помощью TableCellRenderer (который при рендеринге чисел будет использовать NumberFormat для отображения правильного количества десятичных знаков). Поскольку в вашей таблице только два столбца разных типов, самое простое решение - использовать JTable#setDefaultRenderer(Class<?> columnClass, TableCellRenderer renderer). Таким образом, ваши номера всегда будут отображаться с правильным количеством десятичных знаков.

Во-вторых, для вашей проблемы с изданием то же решение может быть довольно элегантным: вызовите JTable#setDefaultEditor(java.lang.Class, javax.swing.table.TableCellEditor) и установите в качестве редактора компонент, который до внесения изменений в вашу табличную модель обеспечит новое значение действительный номер (действительный, конечно, согласно вашим правилам).

1 голос
/ 28 января 2011

JFormattedTextField работает так, как вы описываете, поэтому просто создайте новый CellEditor, который расширяет JFormattedTextField.

0 голосов
/ 28 января 2011

Поместите команду форматирования в блок 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
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...