渲染具有值的单元格

问题描述:

我在JTable中有表格。 2个字符串和一个Integer。我试图渲染(仅整数列)单元格值是否为0 <有我的代码:渲染具有值的单元格

public Component getTableCellRendererComponent(JTable aTable, Object aNumberValue, 
               boolean aIsSelected, boolean aHasFocus, int aRow, int aColumn) { 

    if (aNumberValue == null) { 
     return this; 
    } 
    Component renderer = super.getTableCellRendererComponent(
      aTable, aNumberValue, aIsSelected, aHasFocus, aRow, aColumn 
    ); 

    Number value = (Number) aNumberValue; 
    if (value.doubleValue() < 0) { 
     // do something with renderer 
    } else { 
     // do something with renderer 
    } 
    return this; 
} 

的问题是:我认为,该代码尝试检查所有细胞与字符串列,因为我有错误:该行中的java.lang.String cannot be cast to java.lang.NumberNumber value = (Number) aNumberValue;。你能告诉我如何限制检查只有一列(ID = 1)?

编辑编辑编辑

好吧,我发现如何限制我的渲染。现在我有代码:

class TableRendererExample extends DefaultTableCellRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     int i = (int) value; 
     System.out.println(value); 
     c.setForeground(Color.GREEN); 
     return c; 
    } 
} 

我的问题是...为什么当我尝试打印值是工作,但是当我尝试投对象(值)整数i有例外:java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer。当我打印时,只有值,但问题在于投射...

您可以根据您获取的列索引作为参数进行委托。

从概念上讲,它应该工作如下

public Component getTableCellRendererComponent(JTable aTable, Object aNumberValue, 
               boolean aIsSelected, boolean aHasFocus, int aRow, int aColumn) { 

    if (aColumn != MY_INTEGER_COLUMN_INDEX) 
     // Use the default cell renderer component for 
     // any column except for the Integer column 
     return super.getTableCellRendererComponent(
      aTable, aNumberValue, aIsSelected, aHasFocus, aRow, aColumn 
     ); 

    // special handling for the Integer column 

    if (aNumberValue == null) { 
     return this; 
    } 

    Number value = (Number) aNumberValue; 
    if (value.doubleValue() < 0) { 
     // do something with renderer 
    } else { 
     // do something with renderer 
    } 
    return this; 
} 

关于你的编辑,我只能重申carmickr's answer

    当然
  • ,如果你想投你该列的对象到Integer,您必须确保表模型实际上返回整数值。默认情况下,DefaultTableModel仅返回字符串,因为这些是用户可以键入的值
  • 阅读tutorial和JTable文档。定制JTable中是非常复杂的,所以你一定要了解如何JTable的作品,模特是如何关联等
+0

好的,但当它不是myIntegerColumn,如果renderer对象,我想改变呢? –

+0

“问题是你必须为整个表定义一个TableCellRenderer。”[不,你没有。](http://docs.oracle.com/javase/8/docs/api/javax/swing /table/TableColumn.html#setCellRenderer-javax.swing.table.TableCellRenderer-) – VGR

+0

好的,那么你能告诉我应该使用什么来修复它只有一列? –

要将渲染器添加到特定的列在表中的代码应该是这样的:

table.getColumnModel().getColumn(0).setCellRenderer(customRenderer); 

I'm trying to render (only integer column) cell if value is < 0.

创建自定义渲染器,最简单的方法就是做修改显示的值:

class MyRenderer extends DefaultTableCellRenderer 
{ 
    public MyRenderer 
    { 
     setHorizontalAlignment(JLabel.RIGHT); 
    } 

    @Override 
    public setValue(Object value) 
    { 
     Number number = (Number)value; 

     if (number >= 0) 
      number = null; 

     super.setValue(value); 
    } 
} 

呦您还需要覆盖TableModel的isCellEditable(...)方法或JTable返回Integer.class,并且必须将Integer值存储在TableModel中。

阅读Swing教程How to Use Tables中的部分。 TableToolTipsDemo有一个具有不同数据类型的表的例子。

+0

编辑过的第一篇文章,你能看看这个吗? –

+0

@ J.Carrer,参见编辑。 – camickr