getTableCellRendererComponent参数:"值"和#34; IsSelected"对于JComboBox

时间:2018-01-16 19:10:50

标签: java swing tablecellrenderer

我在JTable中有一个JComboBox,我正在查看解释参数的getTableCellRendererComponent文档。

table - the JTable that is asking the renderer to draw; can be null
value - the value of the cell to be rendered. It is up to the specific renderer to interpret and draw the value. For example, if value is the string "true", it could be rendered as a string or it could be rendered as a check box that is checked. null is a valid value
isSelected - true if the cell is to be rendered with the selection highlighted; otherwise false
hasFocus - if true, render cell appropriately. For example, put a special border on the cell, if the cell can be edited, render in the color used to indicate editing
row - the row index of the cell being drawn. When drawing the header, the value of row is -1
column - the column index of the cell being drawn

我的困惑是"价值"并且"被选中"。如果"值"将被渲染如何选择"被选中"永远是虚假的?如果错误,为什么"值"因为未被选中而被渲染?会呈现什么? TIA。

在camickr的澄清和一些实验之后更新

显然,我只是部分了解发生了什么,并且它给我带来了一个问题。当进行JComboBox选择时," value"的内容是选定的项而不是JComboBox实例。因此,我不再需要渲染JComboBox的实例。我也没有看到" table"的方法。这让我可以获得当前单元格中的组件。如何获取JComboBox实例以便在该单元格中正确呈现框?正如选择一样,JComboBox消失了,我得到了案例2,5,6,7的运行时错误,因为值现在是一个字符串而不是一个JComboBox实例。 TIA。

public class TimelineCellRenderer implements TableCellRenderer {

@SuppressWarnings("unchecked")
@Override
public Component getTableCellRendererComponent(JTable table_, Object value_, boolean isSelected_, boolean hasFocus_, int row_,int column_) {

    Component field=null;
    String str="";
    if (value_!=null) {
        str=value_.toString();
    }
    switch (column_) {
        case 0:
        case 3:
        case 4:
        case 8:
            field=new JTextField();
            ((JTextField) field).setText(str);
            break;
        case 1:
            field=new JTextField();
            ((JTextField) field).setText(Double.toString((Double) value_));
            break;
        case 2:
        case 5:
        case 6:
        case 7:
            field=(JComboBox<String>) value_;
            break;
        case 9:
            field=new JTextField();
            ((JTextField) field).setText("Add button");
            break;
        case 10:
            field=new JTextField();
            ((JTextField) field).setText("del button");
            break;
    }
    if (field instanceof JTextField) {
        Font f=field.getFont().deriveFont(Font.PLAIN, (float) 14);
        field.setFont(f);
    }
    return(field);
}

}

1 个答案:

答案 0 :(得分:1)

每当您单击一个单元格时,所选行都会更改。

因此行中的每个单元格都需要渲染,因为行突出显示需要更改。

在该行中,任何时候都只能选择一个单元格。

此外,之前所选行的所有单元格都需要重新绘制而不突出显示。

所以基本的答案是多次调用该方法,每个单元格调用一次,参数不同。