Необходимо позволять пользователю вводить выражение, примерно так: 125+63-89,6
Потом вычислять результат.
Я реализовал это в InputVerifier'е
Код | public boolean verify(JComponent input) { if (input instanceof JFormattedTextField) { JFormattedTextField ftf = (JFormattedTextField)input; JFormattedTextField.AbstractFormatter formatter = ftf.getFormatter(); if (formatter != null) { String text = ftf.getText(); //Если calc - true то нужно делать вычисление //Если false то это обычное поле и мы просто проверяем число, //что бы оно не было отрицательным if (calc) { text = Calc(text,formatter); try{ ftf.setValue(((Number)formatter.stringToValue(text)).floatValue()); }catch (ParseException pe) {} //ftf.setText(text); } try { float vl = ((Number)formatter.stringToValue(text)).floatValue(); if (vl<0.0f) ftf.setText(formatter.valueToString(0.0f)); return true; } catch (ParseException pe) { return false; } } } return true; }
|
Функцию Calc приводить не буду, она работает.
Выглядит это так http://ipicture.ru/Gallery/Viewfull/9145514.html После того как нажимаем TAB или нажимаем мышкой на Ok все работает, в JFormattedTextField подставляется вычисленное значение, но это и правильно, т.к. фокус покидает это поле, либо переходит к другому полю ввода, либо на какую либо кнопку.
Однако я хотел бы использовать эту возможность и в таблице.
Для ввода числа я написал FloatEditor для float чисел в таблице
Код | public class FloatEditor extends AbstractCellEditor implements TableCellEditor, PropertyChangeListener { private JFormattedTextField fld; private static final String VALUE_CHANGED = "value"; public FloatEditor(ProgramSettings settings){ super(); fld = new JFormattedTextField(new DecimalFormat("0.0")); fld.setFont(settings.getFont(fld.getFont()));//тут меняем размер шрифта fld.setHorizontalAlignment(JFormattedTextField.RIGHT); fld.setFocusLostBehavior(JFormattedTextField.PERSIST); fld.setBorder(BorderFactory.createEmptyBorder()); fld.setInputVerifier(new PositiveFloatVerifier(true));//вот тут устанавливаем проверку ввода //fld.addFocusListener(new MyFocusListener()); fld.addMouseListener(new MyMouseAdapter());//выделение всей ясейки при попадании в нее фокуса fld.addPropertyChangeListener(VALUE_CHANGED, this); } public Object getCellEditorValue(){ //fld.setText(fld.getText()); //System.out.println("this1 "+fld.getValue()); return fld.getValue(); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column){ System.out.println("this "+value); fld.setValue(((Number)value).doubleValue()); fld.selectAll(); return fld; } public void propertyChange(PropertyChangeEvent e) { //Установили новое значение, т.е. нажали Enter if (e.getPropertyName().equals(VALUE_CHANGED)){ //JFormattedTextField ftf = (JFormattedTextField)e.getSource(); //ftf.setValue(ftf.getValue()); // if (ftf.getInputVerifier().verify(ftf)) {//doSomeThing(); fireEditingStopped(); //} } }
|
Так вот проблема в следующем, в таблице написать можно http://ipicture.ru/ И если мышкой перевести фокус в другое место программы, то значение будет вычислено, и оно будет записано в таблицу
Код | @Override public void setValueAt(Object value, int row, int col){ if (col==1){ System.out.println(""+value); ProductInMenu prod = (ProductInMenu)products.get(row); prod.setWeight(((Number)value).floatValue()); mgr.updateProd(prod); fireTableRowsUpdated(row,row); } }
|
Это код модели таблицы
А вот если нажать Enter находясь в таблице, то в ячейку будет записано только первая часть выражения, т.е. написав там 85+63 и нажав Enter в таблицу будет записано только 85.
Вот как то так.
Может как то передавать фокус после нажатия enter, а потом его возвращать назад?
Похожее поведени, точнее оно и связано с этим у InputVerifier'а Если находясь в JFormattedTextField нажимать enter, то корректировки значения не происходит, хотя обратобка начинается, т.е. событие propertyChanged возбуждается, а вот если покинуть это поле, т.е. оно потеряет фокус, то и propertyChanged произойдет и InputVerifier сработает. |