我该如何改变JTable表头的背景颜色?

11

我尝试过:

table.getTableHeader().setBackground(Color.BLACK);

无法正常工作。

编辑:这段代码仅在我的项目中无法正常工作,但在其他项目中可以工作。可能是我更改了一些属性,导致颜色无法更改。或者NetBeans具有保留默认颜色的某些属性。我注意到了另外一件事情。在我的项目中,标题的颜色以不同的方式闪耀。在颜色更改正常的示例中,我看到不同的图形。

编辑2:还有一件事情。我注意到按钮也无法更改颜色。一定是某种通用问题。希望这有所帮助。不幸的是,在这种情况下,SSCCE(小型、自包含、可运行的代码示例)无法解决问题。我肯定正在使用正确的组件名称。


这与NetBeans保留一些默认颜色无关,而与您代码中的错误有关。但是仅凭“此代码仅在我的项目中不起作用”的陈述,且没有任何代码(最好是SSCCE),我怀疑我们中的任何人都无法为您提供更多帮助,除了建议您尝试深入调试。也许您正在尝试更改标题颜色的表格不是显示的相同表格对象,但是如果没有可理解且最好可编译的代码,这只是我猜测而已。 - Hovercraft Full Of Eels
要更改默认颜色:UIManager.put("TableHeader.background", Color.ORANGE); - Olivier
7个回答

15
尝试这个:
table.getTableHeader().setOpaque(false);

然后设置jtable表头的背景

table.getTableHeader().setBackground(Color.BLACK);

12

这对我很有帮助。这是我的SSCCE

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableHeaderBackground {
   public static void main(String[] args) {
      Integer[][] data = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
      String[] cols = {"A", "B", "C"};

      JTable table = new JTable(data, cols);

      JTableHeader header = table.getTableHeader();
      header.setBackground(Color.black);
      header.setForeground(Color.yellow);

      JOptionPane.showMessageDialog(null, new JScrollPane(table));
   }
}

如果这不能帮到您,我建议您创建并发布自己的SSCCE,以便我们可以看到问题在哪里。

1
确实有效。但对于我的表格来说,它不起作用。请参见编辑部分。 - Stefanos Kargas

10

我建议你这样做:

DefaultTableCellRenderer headerRenderer = new DefaultTableCellRenderer();
headerRenderer.setBackground(new Color(239, 198, 46));

for (int i = 0; i < myJTable.getModel().getColumnCount(); i++) {
        myJTable.getColumnModel().getColumn(i).setHeaderRenderer(headerRenderer);
}

4

The table header also uses a renderer component, like table cells.

Look at this:

table.getTableHeader().setDefaultRenderer(new DefaultTableRenderer(){
  {
    // you need to set it to opaque
    setOpaque(true);
  }

@Override
public Component getTableCellRendererComponent(final JTable table,
  final Object value, final boolean isSelected, final boolean hasFocus,
  final int row, final int column) {
    // set the background
    setBackground(yourDesiredColor);
  }
});

如果您不需要动态颜色,也可以在渲染器的构造函数中设置颜色。

1

问题已解决。 在NetBeans中:

  • 右键单击项目名称
  • 属性
  • 应用程序 - 桌面应用程序
  • 外观:选择“Java默认”(与系统默认不兼容)
  • 在运行项目之前记得清理和重建

整个项目的图形外观也发生了变化。


看起来这个选项只适用于类型为Java桌面应用程序的NetBeans项目。考虑更新问题,包括标签[tag:jsr296]。 - trashgod
我仍然认为这可以在代码中解决,你可能没有为正确的引用设置属性。 - Hovercraft Full Of Eels
我建议您将项目连同源代码打成一个jar包并上传到某个地方,然后让我们查看。 - Hovercraft Full Of Eels
谢谢。我讨厌NetBeans设置覆盖我明确的更改,就像这样。另外,我遇到了与OP相同的行为,而且我不认为是他的代码问题。这是因为NetBeans GUI构建器在代码库中的多个位置设置UI属性。如果您使用GUI构建器,这些属性将相当分散,因此很难将其复制并粘贴到SO中易于处理的内容中。 - Adam Hughes

0
private void table_head_color(JTable table_name){
    DefaultTableCellRenderer head_render = new DefaultTableCellRenderer(); 
        
    head_render.setBackground(new Color(204,153,255));
    table_name.getTableHeader().setDefaultRenderer(head_render);

    //to call above method
    //table_head_color("write table name");
}

-2

这个问题很老,但我觉得我有正确的答案...

你需要做的就是将 opaque 设置为 true

例如:

yourComponent.setOpaque(true);

我希望这能在未来帮到某个人。


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