为啥我的 Java 自定义单元格渲染器在选择行/单元格时不显示突出显示?

Posted

技术标签:

【中文标题】为啥我的 Java 自定义单元格渲染器在选择行/单元格时不显示突出显示?【英文标题】:Why does my Java custom cell renderer not show highlighting when the row/cell is selected?为什么我的 Java 自定义单元格渲染器在选择行/单元格时不显示突出显示? 【发布时间】:2011-07-30 06:33:01 【问题描述】:

我有一个用于单元格的自定义单元格渲染器来进行自动换行,以便阅读更多内容。代码如下:

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() 获取选择背景,并在自定义单元格渲染器代码中设置选定的单元格背景。 【参考方案1】:

您必须检查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 getTableCellRendererComponent(..., int row, int column) 将处理一行的每个单元格。因此,如果选择了一行,则该行下的所有单元格都应处于选定行模式。您需要isSelected() 来检查每个单元格是否被选中,因为表格中有很多单元格。 完美!有道理,3 秒内复制粘贴证明它有效。 我必须在我的 JLabel 上添加 setOpaque(true) 才能让它工作。【参考方案2】:

我认为你应该先调用默认实现:

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 .

【讨论】:

他正在扩展 JTextArea,这样就行不通了……(我想你以为他扩展了 DefaultTableCellRenderer)【参考方案3】:

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

【讨论】:

以上是关于为啥我的 Java 自定义单元格渲染器在选择行/单元格时不显示突出显示?的主要内容,如果未能解决你的问题,请参考以下文章

ag-Grid 单元格渲染 - 自定义道具

为啥我的自定义表格单元格中的标签在单击行之前无法显示

为啥自定义表格单元格总是默认大小

如何从模态 UIView 更新自定义单元格中的 UIButton 标题

修复表格视图单元格中的文本,ios?

为啥我在自定义单元格中的复选框在快速选择和滚动时显示不同的行为?