【问题标题】:how to extend BooleanRenderer如何扩展布尔渲染器
【发布时间】:2013-10-04 04:34:03
【问题描述】:

我正在尝试为我的 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,它可以工作。问题是我有一列是布尔值。在我设置我的渲染器之前,我有这个可爱的复选框作为它的默认渲染器。

现在,它只显示“真”或“假”。

另一方面,如果我为布尔列保留默认的 BooleanRenderer,它将不会以整行突出显示...

我也尝试扩展 JTable.BooleanRenderer,但它似乎受到保护,所以我什至无法扩展它。

我怎样才能离开 BooleanRenderer 的这个复选框,但改变行的其余部分的背景颜色?

【问题讨论】:

  • 设置您自己的渲染器,并制作您想要的......或者您可以通过组合 BooleanCellRenderer,首先调用 BooleanCellRenderer#getTableCellRendererComponent 然后使用您的实现......
  • 请解释为什么需要 reson(不知道并且可能有问题)BooleanRenderer,也许我找不到任何理由,或者我错了......
  • 它不会用整行突出显示... == 使用 prepareRenderer

标签: java swing jtable tablecellrenderer


【解决方案1】:

这不能使用继承来完成,因为 BooleanRenderer 是 JTable 的非公共内部类。但是您可以改用合成。例如,创建一个将接受 TableCellRenderer('parent')作为构造函数参数的包装类。如果您将表中的 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 来渲染字符串单元格:

FileTable fileTable = new FileTable();
fileTable.setDefaultRenderer(String.class, new FileTableCellRenderer());
fileTable.setDefaultRenderer(Boolean.class, new 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2011-10-31
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多