使用值渲染单元格

时间:2016-09-28 13:23:56

标签: java swing

我在JTable中有表。 2列包含String,1列包含Integer。如果值为<我正在尝试渲染(仅整数列)单元格有我的代码:

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;
} 

问题是:我认为,该代码尝试使用String列检查所有单元格,因为我在该行中有错误: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;
    }
}

我的问题是......为什么当我尝试打印值时它正在工作但是当我尝试将对象(值)转换为整数时我有异常:java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer。当我打印时,只有值,但问题在于铸造......

2 个答案:

答案 0 :(得分:2)

要将渲染器添加到表格中的特定列,代码应为:

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

如果值为&lt;我正在尝试渲染(仅整数列)单元格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或JTable的isCellEditable(...)方法以返回Integer.class,并且必须在TableModel中存储Integer值。

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

答案 1 :(得分:0)

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

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

-webkit-animation: rotarIz 2s -0.5s linear 10;
animation: rotarIz 2s -0.5s linear 10;

关于您的修改,我只能重述carmickr's answer

  • 当然,如果要将该列的对象强制转换为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; } ,则必须确保表模型实际返回Integer值。默认情况下,Integer仅返回字符串,因为这些是用户可以键入的值
  • 阅读tutorial和JTable文档。自定义JTable可能非常复杂,因此您必须了解JTable的工作原理,模型的相关性等。