我试图为我的JTable实现鼠标悬停效果。 (当鼠标越过表格的行时,行的背景会发生变化)。
为了做到这一点,我扩展了DefaultTableCellRenderer,如下所示:
public class FileTableCellRenderer extends DefaultTableCellRenderer{
public FileTableCellRenderer() {
setOpaque(true);
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
FileTable fileTable = (FileTable)table;
Component c = super.getTableCellRendererComponent(fileTable, value, isSelected, hasFocus, row, column);
if(!isSelected){
if(row == fileTable.getCursorRow())
{
c.setBackground(Color.pink);
c.setForeground(Color.darkGray);
}
else
{
c.setBackground(Color.white);
c.setForeground(Color.darkGray);
}
}
this.setText(value.toString());
return this;
}
}
我设置了JTable的defaultRenderer,它可以工作。问题是我有一列是布尔值。在我设置渲染器之前,我将这个可爱的复选框作为默认渲染器。
现在,它只显示" true"或" false"。
另一方面,如果我为布尔列留下defualt BooleanRenderer,它将不会以整行突出显示...
我也试图扩展JTable.BooleanRenderer,但它似乎受到保护,所以我甚至无法扩展它。
如何保留BooleanRenderer的此复选框,但更改背景颜色与行的其余部分?
答案 0 :(得分:1)
这不能使用继承完成,因为BooleanRenderer是JTable的非公共内部类。但是您可以改用合成。例如,创建一个包装类,该包装类将接受TableCellRenderer(“父”)作为构造函数参数。如果您从表中将BooleanRenderer作为父级传递,则调用其getTableCellRendererComponent()方法将返回一个Checkbox组件,因此您可以对其进行任何进一步的调整(我使用问题代码来设置背景颜色) :
import javax.swing.*;
import javax.swing.plaf.UIResource;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
public class BooleanCellRenderer implements TableCellRenderer, UIResource {
private final TableCellRenderer parent;
public BooleanCellRenderer(TableCellRenderer parent) {
this.parent = parent;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component c = parent.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
FileTable fileTable = (FileTable) table;
if (!isSelected) {
if (row == fileTable.getCursorRow()) {
c.setBackground(Color.pink);
c.setForeground(Color.darkGray);
} else {
c.setBackground(Color.white);
c.setForeground(Color.darkGray);
}
}
return c;
}
}
然后,在包含JTable的主GUI类中,获取表的默认布尔值渲染器并将其传递给包装器:
FileTable fileTable = new FileTable();
fileTable.setDefaultRenderer(Boolean.class, new BooleanCellRenderer(fileTable.getDefaultRenderer(Boolean.class)));
您可以离开FileTableCellRenderer来呈现String单元格:
FileTable fileTable = new FileTable();
fileTable.setDefaultRenderer(String.class, new FileTableCellRenderer());
fileTable.setDefaultRenderer(Boolean.class, new