2013-10-31 87 views
2

我不知道为什么编辑器我设置为我的jtable没有被调用。我用另一个SO Question的编辑器例子。使用JTable单元格编辑器

当我编辑我的jtable它只是编辑为字符串...我期望它只接受数字值。可能会有一些例外,如果我输入任何其他文字......但我不认为编辑器在我编辑我的表时被调用。

import javax.swing.*; 
import javax.swing.table.*; 
import javax.swing.text.NumberFormatter; 

import java.awt.*; 
import java.awt.event.*; 
import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.text.ParseException; 
import java.text.ParsePosition; 
import java.util.Locale; 

public class Grow extends JFrame { 

private static final Object[][] rowData = {{"Hello", "World"}}; 
private static final Object[] columnNames = {"A", "B"}; 

private JTable table; 
private DefaultTableModel model; 

public Grow() { 
    Container c = getContentPane(); 
    c.setLayout(new BorderLayout()); 

    model = new DefaultTableModel(rowData, columnNames); 
    table = new JTable(); 
    table.setModel(model); 
    c.add(new JScrollPane(table), BorderLayout.CENTER); 
    JButton add = new JButton("Add"); 
    JButton delete = new JButton("Delete"); 
    c.add(add, BorderLayout.LINE_START); 
    add.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      model.addRow(rowData[0]); 
     } 
    }); 

    table.setCellEditor(new NumberCellEditor()); 

    c.add(delete, BorderLayout.LINE_END); 
    delete.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      if(table.getSelectedRow()>-1) 
       model.removeRow(table.getSelectedRow()); 
     } 
    }); 

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    pack(); 
} 

class NumberCellEditor extends DefaultCellEditor { 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public NumberCellEditor(){ 
     super(new JFormattedTextField()); 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
     JFormattedTextField editor = (JFormattedTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column); 

     if (value!=null){ 
      DecimalFormat numberFormat = new DecimalFormat("#,##0.00;(#,##0.00)"); 
      editor.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(numberFormat))); 
      Number num = (Number) value; 
      String text = numberFormat.format(num); 
      editor.setHorizontalAlignment(SwingConstants.RIGHT); 
      editor.setText(text); 
     } 
     System.out.println(value); 
     return editor; 
    } 

    /*@Override 
    public boolean stopCellEditing() { 
     try { 
      // try to get the value 
      //this.getCellEditorValue(); 
      return super.stopCellEditing(); 
     } catch (Exception ex) { 
      return false; 
     } 

    } 
    */ 

    @Override 
    public Object getCellEditorValue() { 
     // get content of textField 
     String str = (String) super.getCellEditorValue(); 
     if (str == null) { 
      return null; 
     } 

     if (str.length() == 0) { 
      return null; 
     } 

     // try to parse a number 
     try { 
      ParsePosition pos = new ParsePosition(0); 
      Number n = NumberFormat.getInstance().parse(str, pos); 
      if (pos.getIndex() != str.length()) { 
       throw new ParseException(
         "parsing incomplete", pos.getIndex()); 
      } 

      // return an instance of column class 
      return new Float(n.floatValue()); 

     } catch (ParseException pex) { 
      throw new RuntimeException(pex); 
     } 
    } 
    } 

public static void main(String[] args) { 
    Grow g = new Grow(); 
    g.setLocationRelativeTo(null); 
    g.setVisible(true); 
} 
} 
+2

请问你的目标是什么 – mKorbel

+0

我只是在学习为JTable创建自定义的渲染器和编辑器。我不知道为什么我使用的编辑器在我的示例中没有影响。编辑器没有正确设置,或者我错过了一些重写......? –

回答

2
  • 使用纯香草JTextFieldDocumentFilter代替JFormattedTextField为编辑Component

  • 我不能评论什么的,附start_point为JFormattedTextFieldXxxFormat(重要的细节在官方甲骨文教程,API的How to use FormattedTextFieldNumberFormat等)

  • 你可以添加为InternationalFormatter的过滤仅数

eg

InternationalFormatter formatter = new InternationalFormatter(format); 
formatter.setAllowsInvalid(false); 
//formatter.setMinimum(0.0); 
//formatter.setMaximum(1000.00); 

screen_shot

enter image description here

从代码

import java.awt.Component; 
import java.awt.EventQueue; 
import java.math.RoundingMode; 
import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.text.ParseException; 
import javax.swing.*; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumnModel; 

public class EditorAsRendererTableTest { 

    public EditorAsRendererTableTest() { 
     JTable table = new JTable(3, 2); 
     TableColumnModel colModel = table.getColumnModel(); 
     colModel.getColumn(0).setCellEditor(new MyCellEditor()); 
     colModel.getColumn(0).setCellRenderer(new MyCellEditor()); 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     frame.add(new JScrollPane(table)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new EditorAsRendererTableTest(); 
      } 
     }); 
    } 

    private class MyCellEditor extends AbstractCellEditor implements TableCellEditor, TableCellRenderer { 

     private static final long serialVersionUID = 1L; 
     private JFormattedTextField renderer; 
     private JFormattedTextField editor; 
     private NumberFormat format = DecimalFormat.getInstance(); 

     public MyCellEditor() { 
      format.setMinimumFractionDigits(2); 
      format.setMaximumFractionDigits(4); 
      format.setRoundingMode(RoundingMode.HALF_UP); 
      renderer = new JFormattedTextField(format); 
      renderer.setBorder(null); 
      editor = new JFormattedTextField(format); 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      renderer.setValue(value); 
      return renderer; 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 
      editor.setValue(value); 
      return editor; 
     } 

     @Override 
     public boolean stopCellEditing() { 
      try { 
       editor.commitEdit(); 
      } catch (ParseException e) { 
       return false; 
      } 
      return super.stopCellEditing(); 
     } 

     @Override 
     public Object getCellEditorValue() { 
      return editor.getValue(); 
     } 
    } 
} 
+0

编辑器示例。 – camickr

+0

这个例子真的很有用,但是如果想让这个编辑器允许我遵循如何做:1.如果我选择一个单元格并选择另一个单元格而不输入任何不允许我的东西。如果我点击它,它迫使我输入一些值。 2.如果我输入的值以数字开始,它会将这些数字转换为忽略字母字符的双重值。我如何让它只接受数字? –

2

我预期它仅接受数值

通常不需要创建自定义编辑器。只需重写TableModel的getColumnClass()方法以返回存储在模型中的适当数据类,并且该表将使用适当的渲染器和编辑器。

但是,如果您希望编辑器限制小数位数或对数字进行范围检查,则可以使用自定义编辑器。

相关问题