Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > jTable вход в редактирование


Автор: aliks 15.1.2010, 14:53
Проблема в следующем, предположим в ячейке есть значение "2", пользователь находясь в этой ячейке, наживает "3". В итоге мы в ячейке имеем "23". Как сделать чтобы предыдущее значение затиралось. Думал покрутить так

Код

        myTable.getDefaultEditor(Boolean.class).addCellEditorListener(
                new CellEditorListener() {
                public void editingCanceled(ChangeEvent e) {/*do smth*/}
                public void editingStopped(ChangeEvent e) {/*do smth*/}
              }
        ); 


Но здесь нет входа в режим редактирования.

Автор: access 15.1.2010, 16:41
где-то было уже на форуме, вход на редактирование ч/з ентер, вся ячейка сразу выделяется
Код

        tIndic.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),"cellediting");
        tIndic.getActionMap().put("cellediting", new AbstractAction() {
            public void actionPerformed(ActionEvent e) {
                int row = tIndic.getSelectedRow();
                int col = tIndic.getSelectedColumn();

                if (tIndic.isEditing()) {
                    tIndic.getCellEditor().stopCellEditing();
                }
                else {
                    tIndic.editCellAt(row,col);
                    ((JTextField)tIndic.getDefaultEditor(Double.class).getTableCellEditorComponent(tIndic, tIndic.getValueAt(row, col), true, row, col)).grabFocus();
                    ((JTextField)tIndic.getDefaultEditor(Double.class).getTableCellEditorComponent(tIndic, tIndic.getValueAt(row, col), true, row, col)).selectAll();
                }
            }
        });


tIndic - JTable

Автор: aliks 15.1.2010, 17:14
Ага, классно, вы мой пост мне же скопировали!!!    smile 
Извенюсь, почти мой, я тоже самое писал и советовал
мне не нужно по Enter мне нужно по любой клавише

Автор: access 15.1.2010, 17:19
хм, интересно, у вас в ячейке будет только однозначная цифра? Т.е. было 2, ввели 3 - два затёрлось, осталось 3, ввели 5 - в ячейке остаётся 5. Так что ли? Или, например, отредактировали, запостили, теперь хотите стрелкой вниз переместиться на строку вниз и... опять редактируем ту же ячейку?

Автор: aliks 19.1.2010, 13:12
Число может быть как однозначное так и многозначное

Автор: Connie 26.1.2010, 21:37
Я куски кода накидаю, пример рабочий тут http://www.diacalc.org/online.html

Код

private DecimalFormat df0 = new DecimalFormat("0.0");
private FloatEditor cellEditor0 = new FloatEditor(cellField0, df0);
floatRenderer = new FloatRenderer("0.0");
...
menuList.setDefaultRenderer(Float.class, floatRenderer);//это таблица
menuList.getColumnModel().getColumn(1).setCellEditor(cellEditor0);


Код

import javax.swing.*;
import java.text.*;
import lookout.settings.ProgramSettings;


public class FloatEditor extends DefaultCellEditor{
  private NumberFormat floatFormat;
  private PositiveFloatVerifier pfv = new PositiveFloatVerifier(true);

  public FloatEditor(final JFormattedTextField tf, NumberFormat nf) {
   super(tf);
   floatFormat = nf;
   tf.setFocusLostBehavior(JFormattedTextField.COMMIT);
   tf.setHorizontalAlignment(SwingConstants.RIGHT);
   tf.setBorder(null);
   tf.setFont(ProgramSettings.getInstance().getIn().getFont(tf.getFont()));

   delegate = new EditorDelegate() {
     @Override
    public void setValue(Object param) {
     Float _value = (Float)param;
     if (_value == null) {
      tf.setValue(floatFormat.format(0.0f));
     } else {
      Float _d = _value.floatValue();
      String _format = floatFormat.format(_d);
      tf.setText(_format);
     }
     tf.selectAll();
    }

     @Override
    public Object getCellEditorValue() {
     try {
      pfv.verify(tf);
      String _field = tf.getText();
      Number _number = floatFormat.parse(_field);
      Float _parsed = _number.floatValue();
      Float d = new Float(_parsed);
      return d;
     } catch (ParseException e) {
        return new Float(0.0f);
     }
    }
   };
  }
}



Код
import lookout.settings.ProgramSettings;
import javax.swing.table.DefaultTableCellRenderer;

import java.awt.Component;
import javax.swing.JTable;

import javax.swing.JFormattedTextField;
import javax.swing.JTextField;

import javax.swing.border.Border;
import javax.swing.BorderFactory; 

import javax.swing.UIManager;

import java.text.DecimalFormat;


public class FloatRenderer extends DefaultTableCellRenderer{
   
    private JFormattedTextField fld;
    private Border selectedBorder=null;
    private Border unselectedBorder=null;
    private Border emptyBorder = BorderFactory.createEmptyBorder();
    
    public FloatRenderer(String mask) {
        super(); 
        fld = new JFormattedTextField(new DecimalFormat(mask));
        fld.setHorizontalAlignment(JTextField.RIGHT);
        fld.setEditable(false);
        fld.setFont(ProgramSettings.getInstance().getIn().getFont(fld.getFont()));
        //format.setMinimumFractionDigits(1);
        //format.setMaximumFractionDigits(1);
    }
    
    @Override 
    public Component getTableCellRendererComponent(
                            JTable table, Object value,
                            boolean isSelected, boolean hasFocus,
                            int row, int column) {
        fld.setValue(value);
        //fld.setText(format.format(value));
        if (isSelected){
            fld.setBackground(table.getSelectionBackground());
            if (hasFocus) {
                if (selectedBorder == null) {
                selectedBorder = UIManager.getBorder("Table.focusCellHighlightBorder");
                
                }
                fld.setBorder(selectedBorder);
            } else {
                if (unselectedBorder == null) {
                    unselectedBorder = BorderFactory.createMatteBorder(1,1,1,1,
                                              table.getSelectionBackground());
                }
                fld.setBorder(unselectedBorder);
            }
        }
        else { //Не выбрано и нет фокуса
            fld.setBackground(table.getBackground());
            fld.setBorder(emptyBorder);
            }
 
     return fld;
    }

}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)