Редактирование ячеек в JTable
От: эйчЪ  
Дата: 28.07.06 05:56
Оценка:
Hi All!
При редактировании ячеек (тип Double) значения не затираются, а дописываются в конец.
к примеру выделили ячейку с тек. значением 0.0 назимаем "5" — получаем 0.05, а хотелось бы 5
Re: Редактирование ячеек в JTable
От: JITM  
Дата: 28.07.06 08:29
Оценка:
Здравствуйте, эйчЪ, Вы писали:

Ъ>Hi All!

Ъ>При редактировании ячеек (тип Double) значения не затираются, а дописываются в конец.
Ъ>к примеру выделили ячейку с тек. значением 0.0 назимаем "5" — получаем 0.05, а хотелось бы 5
А если ты два раза кликнешь на ячейке мышкой и нажмёшь "5" у тебя скорее всего запишеться 5, я прав .. ?
Re: Редактирование ячеек в JTable
От: JITM  
Дата: 28.07.06 08:35
Оценка:
Здравствуйте, эйчЪ, Вы писали:

Ъ>Hi All!

Ъ>При редактировании ячеек (тип Double) значения не затираются, а дописываются в конец.
Ъ>к примеру выделили ячейку с тек. значением 0.0 назимаем "5" — получаем 0.05, а хотелось бы 5
А вообще — то приведи код твоего едитора ячеек , посмотрим что можно сделать ..
Re[2]: Редактирование ячеек в JTable
От: эйчЪ  
Дата: 28.07.06 10:10
Оценка:
Здравствуйте, JITM, Вы писали:

JIT>Здравствуйте, эйчЪ, Вы писали:


Ъ>>Hi All!

Ъ>>При редактировании ячеек (тип Double) значения не затираются, а дописываются в конец.
Ъ>>к примеру выделили ячейку с тек. значением 0.0 назимаем "5" — получаем 0.05, а хотелось бы 5
JIT>А вообще — то приведи код твоего едитора ячеек , посмотрим что можно сделать ..
Да стандартно все.
.............
for(int j = 0; j < ArrayServiceNum.size(); j++){
row[j + 1] = new Double(Double.parseDouble(sService));
}
tModel_P.addRow(row);
jTable1.setModel(tModel_P);
.......................
Re[3]: Редактирование ячеек в JTable
От: Blazkowicz Россия  
Дата: 28.07.06 10:54
Оценка: 1 (1)
Здравствуйте, эйчЪ, Вы писали:

Ъ>Да стандартно все.


Все "стандартно" наследуется от DefaultCellEditor и использхует конструктор:
    public DefaultCellEditor(final JTextField textField) {
        editorComponent = textField;
    this.clickCountToStart = 2;
        delegate = new EditorDelegate() {
            public void setValue(Object value) {
        textField.setText((value != null) ? value.toString() : "");
            }

        public Object getCellEditorValue() {
        return textField.getText();
        }
        };
    textField.addActionListener(delegate);
    }


Интересное выделено болдом.

Есть и соответствующее свойство:

    /**
     * Specifies the number of clicks needed to start editing.
     *
     * @param count  an int specifying the number of clicks needed to start editing
     * @see #getClickCountToStart
     */
    public void setClickCountToStart(int count) {
    clickCountToStart = count;
    }

    /**
     * Returns the number of clicks needed to start editing.
     * @return the number of clicks needed to start editing
     */
    public int getClickCountToStart() {
    return clickCountToStart;
    }


Пока не нашел места где символы аппендятся если редактирование начинается с ввода значения.
Re[4]: Редактирование ячеек в JTable
От: JITM  
Дата: 28.07.06 13:26
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, эйчЪ, Вы писали:


полностью согласен ., правда я вот нашол пример работы с Double может поможет :

import SubMacroUtils.FormatBigDecimal;
import javax.swing.AbstractAction;
import javax.swing.DefaultCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.Component;
import java.awt.Toolkit;
import java.text.NumberFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;
 
/**
 * Implements a cell editor that uses a formatted text field
 * to edit Double values.
 */
public class CellDoubleEditor extends DefaultCellEditor {
  JFormattedTextField ftf;
  DecimalFormat DoubleFormat;
  private Double minimum, maximum, decimals;
  private boolean DEBUG = false;
  
  public CellDoubleEditor(double min, double max, int dec) {
    super(new JFormattedTextField());
    ftf = (JFormattedTextField)getComponent();
    minimum = new Double(min);
    maximum = new Double(max);
    decimals = new Double(dec);
    
    DoubleFormat = (DecimalFormat) NumberFormat.getNumberInstance();
    DoubleFormat.setDecimalSeparatorAlwaysShown(true);
    DoubleFormat.setMinimumFractionDigits(dec);
    NumberFormatter doubleFormatter = new NumberFormatter(DoubleFormat);
    doubleFormatter.setFormat(DoubleFormat);
    doubleFormatter.setMinimum(minimum);
    doubleFormatter.setMaximum(maximum);
    
    ftf.setFormatterFactory(new DefaultFormatterFactory(doubleFormatter));
    ftf.setValue(minimum);
    ftf.setHorizontalAlignment(JTextField.TRAILING);
    ftf.setFocusLostBehavior(JFormattedTextField.PERSIST);
    
    //React when the user presses Enter while the editor is
    //active.  (Tab is handled as specified by
    //JFormattedTextField's focusLostBehavior property.)
    ftf.getInputMap().put(KeyStroke.getKeyStroke(
      KeyEvent.VK_ENTER, 0),
      "check");
    ftf.getActionMap().put("check", new AbstractAction() {
      public void actionPerformed(ActionEvent e) {
        if (!ftf.isEditValid()) { //The text is invalid.
          if (userSaysRevert()) { //reverted
            ftf.postActionEvent(); //inform the editor
          }
        } else try {              //The text is valid,
          ftf.commitEdit();     //so use it.
          ftf.postActionEvent(); //stop editing
        } catch (java.text.ParseException exc) { }
      }
    });
  }
  
  //Override to invoke setValue on the formatted text field.
  public Component getTableCellEditorComponent(JTable table,
    Object value, boolean isSelected,
    int row, int column) {
    JFormattedTextField ftf =
      (JFormattedTextField)super.getTableCellEditorComponent(
      table, value, isSelected, row, column);
    if (!Geral.StrEmpty(value.toString()))
      ftf.setValue(value);
    return ftf;
  }
  
  //Override to ensure that the value remains an Double.
  public Object getCellEditorValue() {
    JFormattedTextField ftf = (JFormattedTextField)getComponent();
    Object o = ftf.getValue();
    if (o instanceof Double) {
      return o;
    } else if (o instanceof Integer) {
      return new Double(((Integer)o).doubleValue());
    } else if (o instanceof Number) {
      return new Double(((Number)o).doubleValue());
    } else {
      if (DEBUG) {
        System.out.println("getCellEditorValue: o isn't a Number");
      }
      try {
        return DoubleFormat.parseObject(o.toString());
      } catch (ParseException exc) {
        System.err.println("getCellEditorValue: can't parse o: " + o);
        return null;
      }
    }
  }
  
  //Override to check whether the edit is valid,
  //setting the value if it is and complaining if
  //it isn't.  If it's OK for the editor to go
  //away, we need to invoke the superclass's version
  //of this method so that everything gets cleaned up.
  public boolean stopCellEditing() {
    JFormattedTextField ftf = (JFormattedTextField)getComponent();
    if (ftf.isEditValid()) {
      try {
        ftf.commitEdit();
      } catch (java.text.ParseException exc) { }
      
    } else { //text is invalid
      if (!userSaysRevert()) { //user wants to edit
        return false; //don't let the editor go away
      }
    }
    return super.stopCellEditing();
  }
  
  /**
   * Lets the user know that the text they entered is
   * bad. Returns true if the user elects to revert to
   * the last good value.  Otherwise, returns false,
   * indicating that the user wants to continue editing.
   */
  protected boolean userSaysRevert() {
    Toolkit.getDefaultToolkit().beep();
    ftf.selectAll();
    Object[] options = {"Corrigir","Reverter"};
    int answer = JOptionPane.showOptionDialog(
      SwingUtilities.getWindowAncestor(ftf),
      "O valor deve estar entre "
      + minimum + " e "
      + maximum + ".\n"
      + "Você pode corrigir "
      + "ou reverter para o último valor válido.",
      "Valor inválido digitado",
      JOptionPane.YES_NO_OPTION,
      JOptionPane.ERROR_MESSAGE,
      null,
      options,
      options[1]);
    
    if (answer == 1) { //Revert!
      ftf.setValue(ftf.getValue());
      return true;
    }
    return false;
  }
}


С уважением, JITM!
Re[5]: Редактирование ячеек в JTable
От: эйчЪ  
Дата: 31.07.06 04:51
Оценка:
Здравствуйте, JITM, Вы писали:

Спасибо большое. Все получилось.
Я тоже нашел, тока для целых и переделал для double.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.