为啥我的 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;
【讨论】:
如果选择了行,是否意味着选择了单元格? @BriangetTableCellRendererComponent(..., 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);
...
默认实现将处理所有常用参数,例如isSelected
和hasFocus
,设置文本和背景颜色,激活焦点边框等。然后您将更改显示的文本,更改单元格大小和return this
.
【讨论】:
他正在扩展 JTextArea,这样就行不通了……(我想你以为他扩展了 DefaultTableCellRenderer)【参考方案3】:使用 setSelectionColor(Color.GREEN);您正在告诉用户选择的内容是绿色的。你的问题是什么,你希望你的代码做什么?
【讨论】:
以上是关于为啥我的 Java 自定义单元格渲染器在选择行/单元格时不显示突出显示?的主要内容,如果未能解决你的问题,请参考以下文章