Добрый день. Пытаюсь поместить форматтед текст филд в таблицу. написала свой эдитор. вот такой: | Код | /* * Editor.java * * Created on 17 Сентябрь 2007 г., 13:20 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */
package com.acorah.propertyplanner.classes;
import java.awt.Color; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.awt.event.MouseEvent; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.ParseException; import java.util.EventObject; import javax.swing.DefaultCellEditor; import javax.swing.JFormattedTextField; import javax.swing.JFormattedTextField.AbstractFormatter; import javax.swing.JTable; import javax.swing.text.DefaultFormatterFactory; import javax.swing.text.NumberFormatter; import javax.swing.SwingConstants;
/** * * @author swatch */ public class Editor extends DefaultCellEditor { JFormattedTextField ftf = new JFormattedTextField(); protected int clickCountToStart = 1; protected EditorDelegate delegate; private DefaultFormatterFactory factory; public Object getCellEditorValue() { try{ Double _parse = Double.parseDouble(ftf.getText()); return _parse; }catch(NumberFormatException e){ return ftf.getValue(); } } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { ftf.setValue(value); DecimalFormatSymbols dfs = new DecimalFormatSymbols(); dfs.setGroupingSeparator(','); AbstractFormatter displayFormatter = new NumberFormatter(new DecimalFormat("#,###", dfs)); ((NumberFormatter)displayFormatter).setValueClass(Object.class); AbstractFormatter editFormatter = new NumberFormatter(new DecimalFormat("#,###")); ((NumberFormatter)editFormatter).setValueClass(Object.class); DefaultFormatterFactory factory = new DefaultFormatterFactory(displayFormatter,displayFormatter,editFormatter); ftf.setFormatterFactory(factory); ftf.setHorizontalAlignment(SwingConstants.RIGHT); return ftf; } public boolean isCellEditable(EventObject anEvent) { if (anEvent instanceof MouseEvent) { return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart; } return true; } public void setClickCountToStart() { clickCountToStart = 1; } public void setValue(Object value) { Double val = (Double)value; if (ftf.getText().length() != 0){ if (val == null){ ftf.setValue(null); }else { Double d = val.doubleValue(); ftf.setValue(d); ftf.setText(ftf.getValue().toString()); } } else { ftf.setValue(null); ftf.setText(""); } } public boolean stopCellEditing() { fireEditingStopped(); return true; } public Editor(final JFormattedTextField ftf){ super(ftf); ftf.setFocusLostBehavior(JFormattedTextField.COMMIT); DecimalFormatSymbols dfs = new DecimalFormatSymbols(); dfs.setGroupingSeparator(','); AbstractFormatter displayFormatter = new NumberFormatter(new DecimalFormat("#,###", dfs)); ((NumberFormatter)displayFormatter).setValueClass(Object.class); AbstractFormatter editFormatter = new NumberFormatter(new DecimalFormat("#,###")); ((NumberFormatter)editFormatter).setValueClass(Object.class); DefaultFormatterFactory factory = new DefaultFormatterFactory(displayFormatter,displayFormatter,editFormatter); ftf.setFormatterFactory(factory); ftf.setHorizontalAlignment(SwingConstants.RIGHT); ftf.setBorder(null); ftf.addPropertyChangeListener(new java.beans.PropertyChangeListener() { public void propertyChange(java.beans.PropertyChangeEvent evt) { JFormattedTextField ftf = (JFormattedTextField)evt.getSource(); ftf.setSelectionStart(0); ftf.setSelectionEnd(ftf.getText().length()); ftf.setSelectedTextColor(Color.BLACK); } }); ftf.addFocusListener(new FocusAdapter(){ public void focusGained(FocusEvent e){ JFormattedTextField ftf = (JFormattedTextField) e.getSource(); ftf.setSelectionStart(0); ftf.setSelectionEnd(ftf.getText().length()); ftf.setSelectedTextColor(Color.BLACK); } public void focusLost(FocusEvent e){ JFormattedTextField ftf = (JFormattedTextField) e.getSource(); try { ftf.commitEdit(); } catch (ParseException ex) { ftf.setValue(null); } } }); ftf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { stopCellEditing(); } }); } }
|
Все нормлаьно работает. Только если редактировать ячейку, в которой было что-то записано, то значение не сохраняется, если не нажать сначала энтер. Может кто понимает, в чем дело? И еще, т.к. редактируется постоянно какая-то ячейка, то текст никогда не отображается с запятой. и почему-то никогда не выделяется при попадании фокуса. Кстати, форматтед текст филд помезаю в таблицу вот так: | Код | JFormattedTextField jtf1 = new JFormattedTextField(); jtf1.addFocusListener(new FocusAdapter(){ public void focusGained(FocusEvent e) { JFormattedTextField jtf1 = (JFormattedTextField) e.getSource(); jtf1.setSelectionStart(0); jtf1.setSelectionEnd(jtf1.getText().length()); jtf1.setSelectedTextColor(Color.BLACK); } }); TableColumn column1=jTable1.getColumnModel().getColumn(1); column1.setCellEditor(new Editor(jtf1)); for (int row=0; row<jTable1.getRowCount(); row++){ Editor editor1 = (Editor)jTable1.getCellEditor(row,1); editor1.setClickCountToStart(); }
|
Есть какие-нибудь идеи по моим вопросам??? Очень нужна помощь!!!
|