Java 设置JTableHeader支架背景颜色

Java 设置JTableHeader支架背景颜色,java,swing,jtable,jtableheader,Java,Swing,Jtable,Jtableheader,我的程序中有一个JTable,我想更改JTableHeader的颜色。我使用下面的代码实现了这一点 JTableHeader header = table.getTableHeader(); header.setBackground(Color.WHITE); 然而,当我拖动标题时,我注意到标题后面有一个灰色区域,如下图所示 如何将其设置为白色,以便与我的JTableHeader相匹配 MCVE import java.awt.Color; import java.awt.GridLayou

我的程序中有一个
JTable
,我想更改
JTableHeader
的颜色。我使用下面的代码实现了这一点

JTableHeader header = table.getTableHeader();
header.setBackground(Color.WHITE);
然而,当我拖动标题时,我注意到标题后面有一个灰色区域,如下图所示

如何将其设置为白色,以便与我的
JTableHeader
相匹配

MCVE

import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class JTableTest extends JFrame {
    private JTableTest()  {
        super("JTable Test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(1, 1));
        createPanel();
        pack();
        setVisible(true);
    }

    JPanel panel = new JPanel(new GridLayout(1, 1));
    JScrollPane scroll = new JScrollPane();

    private void createPanel() {
        Object[] headers = {"Select", "Title", "Artist", "Length"};
        Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673"},
                {false, "Spanish Train", "Chris De Burgh", "358"}};
        JTable table = new JTable(sampleData, headers);
        ///
        JTableHeader header = table.getTableHeader();
        header.setBackground(Color.WHITE); //Sets header white
        ///
        scroll.getViewport().add(table);
        scroll.getViewport().setBackground(Color.WHITE); //Sets table container white
        panel.add(scroll);
        panel.setBackground(Color.WHITE); //Sets scroll pane container white
        getContentPane().add(panel);
        getContentPane().setBackground(Color.WHITE); //Sets panel container white
        //What should be set to white to make header container white
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater (
            new Runnable() {
                @Override
                public void run() {
                    new JTableTest();
                }
            }
        );
    }
}

正如我预期的,我们需要将标题的父项设置为您想要的背景色

但是,滚动窗格并不像我预期的那样是标题的父级

当我添加如下代码时:

System.out.println( header.getParent() );
它显示了一个JViewport作为父对象,这让我很困惑

然而,当我补充说:

System.out.println( scroll.getViewport() );
我注意到这两个视口是不同的。因此,滚动窗格的视口似乎与标题的视口不同

因此,问题的解决办法是:

JTableHeader header = table.getTableHeader();
header.setBackground(Color.GREEN); 
然后,帧可见后,您可以执行以下操作:

header.getParent().setBackground(Color.YELLOW);
(我使用不同的颜色只是为了显示每个语句的效果)

注意:在包装框架或使其可见之前,标题不会添加到滚动窗格中。如果在创建表时尝试设置背景,则在尝试访问父级时将获得NPE


或者另一个选项是向
JTableHeader
添加一个
AncestorListener
。然后可以调用代码,然后将标题添加到可见的帧中。对于这种类型的方法,请查看
请求焦点侦听器
,该侦听器位于check out:@camickr,很抱歉,我不太确定该问题的答案是什么。您指的是
jsp.getViewport().setBackground(Color.WHITE)因为这对这部分没有任何影响?或者你指的是
ScrollablePanel
?@camickr抱歉,我确实读过,而且我通常会发表评论(这次显然不是),我不确定你是否读过这个答案,因为你从未评论过这个建议是否有用。所以我不会花时间回答这个问题,想知道你是否也会回答这个问题。无论如何,我认为在Widows7上使用JDK8没有问题。可能是版本/平台问题?或者问题是你的代码没有显示?@camickr在使用jdk8(最新版本)的windows8.1上测试。拖动列标题时的背景实际上是灰色的,而不是白色的。我指的是标题列容器的背景,而不是标题列本身。谢谢。我只是让它工作。我在标题上添加了一个
MouseAdapter
,这样当第一次点击它时,它就会设置颜色。有没有更好的方法来实现这一点,因为当我创建了框架,然后在框架可见后制作了
JTable
,我仍然得到了NPE。(可能在某个地方出错,但只是检查一下)
有没有更好的方法
-我已经给了你一个(通过使用AncestorListener),所以代码只执行一次。此外,创建JTable还不够。该表需要添加到滚动窗格中。感谢您的帮助。我很感激您建议使用
antestorlistener
来实现此代码,但它是
EventQueue.invokeLater(()->header.getParent().setBackground(Color.WHITE))更好的方法?@Dan,所有组件(表、标题、视口)的背景设置都应该在相同的逻辑代码块中完成。与使用匿名AncestorListener相反,使用invokeLater()可以在一行代码中实现这一点。使用invokeLater()意味着您必须在同一代码块中的窗口上使用pack()、setVisible()。我想这在99.9%的情况下是正确的,但基本上您已经在代码的执行顺序上建立了逻辑依赖关系。可能没什么大不了的,只是想指出细微的区别。