Java-Swing-JTable-设置选定行的颜色,但不设置单元格的颜色

Java-Swing-JTable-设置选定行的颜色,但不设置单元格的颜色,java,swing,colors,jtable,cell,Java,Swing,Colors,Jtable,Cell,我试图让我的表在单击单元格时选择整行(这可以通过关闭列选择来实现),但是,我不希望突出显示单击的特定单元格周围的超厚边框。我希望这会很容易,但显然它涉及渲染器,所以我做了很多研究,我能得到的最接近的结果是: JTable contactTable=新的JTable(tableModel); contactTable.setCellSelectionEnabled(真); contactTable.setColumnSelectionAllowed(假); contactTable.setRowS

我试图让我的表在单击单元格时选择整行(这可以通过关闭列选择来实现),但是,我不希望突出显示单击的特定单元格周围的超厚边框。我希望这会很容易,但显然它涉及渲染器,所以我做了很多研究,我能得到的最接近的结果是:

JTable contactTable=新的JTable(tableModel);
contactTable.setCellSelectionEnabled(真);
contactTable.setColumnSelectionAllowed(假);
contactTable.setRowSelectionAllowed(假);
contactTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//此渲染器扩展了一个组件。它每次使用一次
//必须显示单元格。
类MyTableCellRenderer扩展JLabel实现TableCellRenderer{
//每次列中有单元格时都会调用此方法
//使用此渲染器需要进行渲染。
公共组件GetTableCellRenderComponent(JTable表、对象值、,
boolean isSelected、boolean hasFocus、int rowIndex、int vColIndex){
//“value”是位于的单元格中包含的值
//(行索引,vColIndex)
如果(当选){
//选择单元格(可能还有其他单元格)
}
如果(hasFocus){
//此单元格是定位点,表具有焦点
这个.背景(颜色.蓝色);
这个.setForeground(颜色.绿色);
}否则{
这个.setForeground(颜色.黑色);
}
//使用指定的值配置组件
setText(value.toString());
//如果需要,设置刀具尖端
//setToolTipText((字符串)值);
//因为渲染器是一个组件,所以返回它自己
归还这个;
}
//出于性能原因,以下方法会覆盖默认值
public void validate(){}
public void revalidate(){}
受保护的void firePropertyChange(字符串propertyName、对象oldValue、对象newValue){}
public void firePropertyChange(字符串propertyName、布尔值oldValue、布尔值newValue){}
}
int vColIndex=0;
TableColumn col=contactTable.getColumnModel().getColumn(vColIndex);
col.setCellRenderer(新的MyTableCellRenderer());
我从一个示例复制了渲染器,只更改了hasFocus()函数以使用我想要的颜色。在
isSelected()
中设置颜色没有任何作用

此代码的问题是:

  • 它仅适用于底部vColIndex指定的一列。显然,我希望这适用于所有列,因此单击其中一个单元格将突出显示整行。我可以创建一个for循环,将其更改为每个单元格,但我认为有一种更好的方法可以一次更改所有列的cellRenderer

  • setForegroundColor()
    用于更改文本,但
    setBackgroundColor()
    对单元格背景不做任何操作。我希望它能像属性所暗示的那样改变背景颜色

    • #2的解决方案:使用
      this.setOpaque(true)在指定背景色之前
  • 当渲染器工作时,它仅在单个单元格上工作。我怎样才能让它为行中的所有单元格着色

    • #3的解决方案:我想出来了!如果启用行选择(
      table.setRowSelectionAllowed(true)
      ),则在
      if(isSelected)
      语句中添加颜色更改,而不是使用只影响单个单元格的
      hasFocus()
      。然后整个行被认为是选中的,并且它为所有单元格着色

  • 3是一个大问题,但如果有人知道#1或者可以向我解释为什么它设计为一次只能对一列应用渲染器,我将不胜感激。

    对于第二个问题,您可以尝试setSelectionBackground(Color)和setSelectionForeGround(Color)方法。我不知道你怎样才能解决第一个问题。最后一个建议是,你可以使用一些swing设计器插件,比如JBuilder。这会有很大帮助。

    教程文章解释了“通常使用单个单元格渲染器来绘制包含相同类型数据的所有单元格”,这是由模型的
    getColumnClass()
    方法返回的


    或者,重写对所有单元格调用的
    prepareRenderer()
    ,以选择性地更改行的外观。这将比较这两种方法,本文将进一步介绍这种方法的多功能性。

    太直接了,只需添加行即可

    tablename.setSelectionBackground(Color.red);
    
    就我而言

    jtbillItems.setSelectionBackground(Color.red);
    

    谢谢你的回复。我尝试使用setSelectionBackground(Color),但Eclipse将其标记为不存在的方法。当我选择一行或多行时,它们的颜色会改变。但也许我理解错了你在寻找什么。你可以像contactTable.setSelectionBackground(颜色:深灰色)一样使用它;至少它对我有用。哦,我明白了,我以为它是一种组件方法。正确地使用它,效果非常好,除了整行高亮显示外,特定单元格还有一个额外的边框。使用不同的渲染器的主要目的是去除特定的单元格边框,并使整行仍然高亮显示。仅当您没有设置背景颜色的TableCellRenderer时。在这种情况下,如果(!isSelected){setBackground(color1);}
    ,则必须添加