Java Swing JTable-以与所选行其余部分不同的颜色高亮显示所选单元格?

Java Swing JTable-以与所选行其余部分不同的颜色高亮显示所选单元格?,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我有一个基本的swing JTable,要求在单击任何单元格时,整个行都应高亮显示,并且被单击的单元格的颜色应与高亮显示行的其余部分不同 目前,我被认为是真实的 我尝试使用自定义TableCellRenderer,如下所示: public class CustomTableCellRenderer extends DefaultTableCellRenderer { public static final DefaultTableCellRenderer DEFAULT_RENDERER

我有一个基本的swing JTable,要求在单击任何单元格时,整个行都应高亮显示,并且被单击的单元格的颜色应与高亮显示行的其余部分不同

目前,我被认为是真实的

我尝试使用自定义TableCellRenderer,如下所示:

public class CustomTableCellRenderer extends DefaultTableCellRenderer
{

public static final DefaultTableCellRenderer    DEFAULT_RENDERER    = new DefaultTableCellRenderer();
    @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

    if (isSelected) {
        c.setBackground(Color.red);
    }
    else {
        c.setForeground(Color.black);
        c.setBackground(Color.white);
    }
    return c;   
  }     
}
UIManager.put("Table.focusCellBackground", 
         new javax.swing.plaf.ColorUIResource (Color.red));
但这似乎不起作用(整行以红色突出显示)

我还尝试如下设置UIManager属性:

public class CustomTableCellRenderer extends DefaultTableCellRenderer
{

public static final DefaultTableCellRenderer    DEFAULT_RENDERER    = new DefaultTableCellRenderer();
    @Override
  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Component c = DEFAULT_RENDERER.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

    if (isSelected) {
        c.setBackground(Color.red);
    }
    else {
        c.setForeground(Color.black);
        c.setBackground(Color.white);
    }
    return c;   
  }     
}
UIManager.put("Table.focusCellBackground", 
         new javax.swing.plaf.ColorUIResource (Color.red));
但这似乎也不起作用(即使在我尝试使用

UIManager.put("Table.focusCellHighlightBorder", 
         new BorderUIResource.LineBorderUIResource(Color.red)); 
(效果很好)


您能给我一些建议吗?

您需要关闭表格的行选择和单元格选择。然后找到返回的方法,并在需要时突出显示该行

但这似乎不起作用(整行以红色突出显示)

您需要检查“hasFocus”变量,而不是“isSelected”变量

另一种替代创建多个自定义渲染器(如果您的表中有不同类类型的列)的方法是使用该方法。

尝试以下方法:

jtable.setCellSelectionEnabled(true);
然后在
GetTableCellRenderComponent

if (table.isCellSelected(row, column))
    setForeground(Color.red);
else if (table.isRowSelected(row))
    setForeground(Color.green);
else if (table.isColumnSelected(column))
    setForeground(Color.blue);
else
    setForeground(Color.black);

这将使选定的单元格显示为红色,行的其余部分显示为绿色,列的其余部分显示为蓝色。注意:单元格选择要求选择模型是单一的,其他选择模型可能会导致不可预测的行为。

您的意思是我打开CellSelectionEnabled(true),然后使用类似于以下的方式处理行选择?表.changeSelection(行、列、切换、扩展)?它给出了同样的结果。是的,第一部分,第二部分。您需要一个单元格渲染器,以不同于所选单元格的颜色高亮显示所选行。我尝试了此操作,但它根本不会更改颜色。对于
isCellSelected
isRowSelected
,它确实进入了if条件,但似乎没有做任何事情。对不起,我的错误-我尝试过了,效果很好。谢谢。(由于工作代码,将此设置为可接受答案。其他答案也有助于学习)。