在JTable中绘制行

时间:2009-07-01 00:32:44

标签: java swing

我有一个DefaultTableCellRenderer的实现。当有人在表格中选择一行时,该行会突出显示为绿色。如果我想突出显示选定的那一行,最简单的方法是什么?这甚至可以在不重新渲染整个表的情况下实现吗?

所以目前,我有一些看起来像这样的东西:

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
    Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    if (isSelected) {
        component.setBackground(Color.GREEN);

        // Somewhere here I would like to retrieve the row below the current row and give it another color

    } else {
        component.setBackground(Color.WHITE);
    }
    return component;
}

1 个答案:

答案 0 :(得分:4)

稍微改变一下你的想法。您不需要选定行的渲染器来控制下面的行。您应该做什么让每一行检查并查看上面的行是否被选中,如果是,那么它会突出显示。

if (table.isRowSelected(row - 1)) {
    // Highlight self.
    component.setBackground(Color.YELLOW);
}

每当选择更改时,您可能还需要使突出显示的行重新绘制。我怀疑Java只会重新绘制默认选择/取消选择的行,因此下面的行不会重新绘制。我当前的机器上没有JDK所以我无法测试,但如果是这样的话,那么这样的事情应该可以解决问题:

table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
    public void valueChanged(ListSelectionEvent event) {
        table.repaint();
    }
});

实际上,您可以更聪明,只重绘需要重新绘制的确切行。如果你这么倾向的话,我会把它作为一种练习(一项艰难而不是非常有价值的练习)。