java - 设置 JTableHeader 持有者背景颜色

标签 java swing jtable jtableheader

我的程序中有一个 JTable,我想更改 JTableHeader 的颜色。我使用以下代码完成了此操作

JTableHeader header = table.getTableHeader();
header.setBackground(Color.WHITE);

但是,当我拖动标题时,我注意到标题后面有一个灰色区域,如下图所示。

enter image description here

如何将其设置为白色,以便它适合我的 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();
                }
            }
        );
    }
}

最佳答案

正如我所料,我们需要将标题的父级设置为您想要的背景颜色。

但是,正如我所期望的那样,滚动 Pane 不是标题的父级。

当我添加如下代码时:

System.out.println( header.getParent() );

它显示 JViewport 作为父级,这让我很困惑。

但是当我添加时:

System.out.println( scroll.getViewport() );

我注意到两个视口(viewport)不同。因此,滚动 Pane 的视口(viewport)与标题的视口(viewport)不同。

所以问题的解决方案是:

JTableHeader header = table.getTableHeader();
header.setBackground(Color.GREEN); 

然后之后框架可见,您可以执行以下操作:

header.getParent().setBackground(Color.YELLOW);

(我使用不同的颜色只是为了显示每个语句的效果)

请注意,在框架被打包或变得可见之前,标题不会添加到滚动 Pane 中。如果您尝试在创建表时设置背景,则在尝试访问父表时将收到 NPE。

或者另一种选择是将 AncestorListener 添加到 JTableHeader。然后可以调用代码,然后将 header 添加到可见框架中。对于这种类型的方法,请查看Dialog Focus中的Request Focus Listener

关于java - 设置 JTableHeader 持有者背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40698612/

相关文章:

java - 如何更改禁用的树查看器的节点背景颜色

Java 14记录json序列化

java - 多线程java的完整执行时间

java - 如何在 Java Swing 中构建 Google-chrome 选项卡和菜单栏界面?

java - JTable 在绘制期间抛出 IndexOutOfBoundsException

java - 无法让@Singleton 做任何事情

java - 如何在 JFrame 上对 ImageIcon 进行动画处理,图像将加载但不会更改

java - Graphics#drawText,旧文本不会被删除

java - 在 Groovy SwingBuilder 中,如何将闭包附加到选择单元格时触发的 JTable?

java - 如何在窗口大小调整时保持 JTable 自定义渲染器的外观?