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