2010-07-22 101 views
1

我有一个使用自定义TableModel来显示一系列对象实例的JTable。 getValueAt(int row, int column)内有一个开关盒,可以根据给定的属性返回值(见下文)。一个返回语句涉及将1/0的值作为真/假返回。在编辑单元格时切换值

是否有一种方法可以修改此TableModel,以便在编辑单元格时显示1/0?

public Object getValueAt(int row, int column) { 
    User user = (User)dataVector.get(row); 
    switch (column) { 
     case ID_INDEX: 
      return user.getId(); 
     case USERNAME_INDEX: 
      return user.getUserName(); 
     case PASSWORD_INDEX: 
      return "****"; 
     case ACTIVATED_INDEX: 
      return (user.getActivated())?"true":"false"; 
     default: 
      return new Object(); 
    } 
} 

回答

1

default renderer and editor for BooleanJCheckBox。考虑使用

case ACTIVATED_INDEX: 
    return Boolean.valueOf(user.getActivated()); 

或者,

case ACTIVATED_INDEX: 
    return (user.getActivated())?"1":"0"; 

附录:作为一个例子,DefaultTableModel不会覆盖getColumnClass(),和AbstractTableModel简单地返回Object.class。你TableModel应该重写getColumnClass()相应:

DefaultTableModel dtm = new DefaultTableModel() { 

    @Override 
    public Class<?> getColumnClass(int col) { 
     return getValueAt(0, col).getClass(); 
    } 
}; 
// add some data 
JTable table = new JTable(dtm); 
+0

谢谢。我使用的TableModel似乎产生了一个简单的String而不是JCheckBox。从链接看来,所使用的渲染器取决于'getColumnClass()'的结果。 – 2010-07-23 08:17:02

+0

@詹姆斯:是的,我已经详细阐述过了。 – trashgod 2010-07-23 10:39:04

1

你需要看看TableCellRendererTableCellEditor

一个TableCellRenderer负责渲染单元格数据时,它没有被编辑,其中作为TableCellEditor负责用于提供用于编辑单元格值的组件。因此,您可以用两种不同的方式表示数据,具体取决于它是按照正常情况编辑还是仅呈现。

但是,您应该考虑如果您从getValueAt()方法返回布尔类型,那么当单元格处于编辑模式时,您的JTable应该自动呈现JCheckBox,通过像往常一样点击它可以更改JCheckBox值。要做到这一点只是返回:

case ACTIVATED_INDEX: 
    return Boolean.valueOf(user.getActivated()); 
+1

链接已更新并更改为'TableCellRenderer和'TableCellEditor'。 – trashgod 2010-07-22 03:22:54

+0

不用担心。谢谢。 – S73417H 2010-07-22 05:46:03

相关问题