为什么我的Java自定义单元格渲染器在选中行/单元格时无法显示高亮?

10

我有一个自定义的单元格渲染器,可以进行单词换行,以便更多内容可以被阅读。以下是代码:

import java.awt.Color;
import java.awt.Component;
import java.awt.Insets;

import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.TableCellRenderer;

public class TextWrapCellRenderer extends JTextArea implements TableCellRenderer {
    private static final long serialVersionUID = 1L;

    public TextWrapCellRenderer() {
        setLineWrap(true);
        setWrapStyleWord(true);
        setMargin(new Insets(0, 5, 0, 5));
        setSelectionColor(Color.GREEN);
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setText((String)value);
        setSize(table.getColumnModel().getColumn(column).getWidth(),getPreferredSize().height);
        setSelectionColor(Color.GREEN);

        return this;
    }
}

更新:单元格渲染器已经正确使用,但是当用户在JTable中选择一行时,它只会为未自定义渲染的单元格显示高亮。然而,该行中的所有其他单元格都显示高亮。这导致只有一个单元格具有白色背景,而该行的其余部分具有蓝色(在我的情况下)作为高亮的背景颜色。


看起来我可以使用JTable的setSelectionBackground()或者使用getSelectionBackground()获取选择背景,然后在自定义单元格渲染器代码中设置选定单元格的背景。 - Brian T Hannan
3个回答

13

您需要检查isSelected参数以查看单元格是否已选择,类似于:

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
{
        setText((String)value);
        setSize(table.getColumnModel().getColumn(column).getWidth(),getPreferredSize().height);
        setSelectionColor(Color.GREEN);

        if (isSelected)
        {
            setBackground(table.getSelectionBackground());
            setForeground(table.getSelectionForeground());
        }
        else
        {
            setBackground(table.getBackground());
            setForeground(table.getForeground());
        }
        return this;
    }

那么,如果行被选中,意味着单元格被选中吗? - Brian T Hannan
@Brian getTableCellRendererComponent(..., int row, int column) 方法将处理每一行的每个单元格。因此,如果选择了一行,则该行下的所有单元格都应处于所选行模式。由于表格中有许多单元格,您需要使用 isSelected() 来检查每个单元格是否被选中。 - eee
完美!容易理解,并且在三秒内复制并粘贴证明它有效。 - Brian T Hannan
1
我不得不在我的JLabel上添加setOpaque(true)才能使其正常工作。 - ban-geoengineering

3
我认为您应该首先调用默认实现:
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
    ...

默认实现将处理所有常规参数,例如isSelectedhasFocus,设置文本和背景颜色,激活焦点边框等。然后您将更改显示的文本,更改单元格大小并return this


1
他正在扩展JTextArea,所以那样做行不通...(我认为你应该是想让他扩展DefaultTableCellRenderer) - Uhlen

-1
使用 setSelectionColor(Color.GREEN); 你告诉用户选择的内容是绿色的。你有什么问题,以及你希望你的代码做什么?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接