Java 更改JTable表格标题后面的背景

Java 更改JTable表格标题后面的背景,java,swing,background,jtable,Java,Swing,Background,Jtable,我有一个应用程序与几个表和白色的应用程序背景,以融入使用过的标志。我已将所有背景设置为白色,但有一个空间我目前无法到达。 使用我正在使用的标准JTable,可以移动列,这非常好。但是,当移动列时,您仍然可以看到TableHeader后面的标准应用程序颜色。在JScrollPane中显示时,我认为设置ScrollPane.getContentHeader()的背景会有所帮助,但我得到了一个NPE 下面是一个显示问题的小程序: import java.awt.BorderLayout; import

我有一个应用程序与几个表和白色的应用程序背景,以融入使用过的标志。我已将所有背景设置为白色,但有一个空间我目前无法到达。
使用我正在使用的标准JTable,可以移动列,这非常好。但是,当移动列时,您仍然可以看到TableHeader后面的标准应用程序颜色。在JScrollPane中显示时,我认为设置
ScrollPane.getContentHeader()
的背景会有所帮助,但我得到了一个NPE

下面是一个显示问题的小程序:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class testsforSO extends JFrame {

    private static final long serialVersionUID = -3890178393751567629L;
    private JTable table;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    testsforSO frame = new testsforSO();
                    frame.setSize(300, 300);
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public testsforSO() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout(0, 0));

        JScrollPane scrollPane = new JScrollPane();
        getContentPane().add(scrollPane, BorderLayout.CENTER);



        String[] columns = new String[] { "ABC", "DEF", "XYZ" };
        TableModel tm = new DefaultTableModel(columns, 3);

        table = new JTable();
        table.setModel(tm);
        table.getTableHeader().setBackground(Color.WHITE); //Does its job
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        scrollPane.setViewportView(table);
    }
}
移动三列中的一列时,您会注意到LAF的标准背景(对于我来说,它是标准的Windows LAF,颜色类似米色),而不是白色,即使表头的背景设置为白色。
对于滚动窗格宽度中没有显示表格标题的部分也设置了颜色,并将标题的颜色设置为正确的颜色,但我不知道如何为标题后面的空间设置颜色

编辑:在这似乎被误解之后,我对我的问题做了一个屏幕:


不幸的是,您看不到光标,但我将该列保持在其标题处并将其拖动到右侧。

您的问题基于代码行(因为我认为
JTable
未指定为不可调整大小,可能这是bug,也可能是它的特性)

您可以在
渲染器

table.getTableHeader().setBackground(scrollPane.getBackground()); 
我会使用
JTable.AUTO\u RESIZE\u OFF
,在大多数情况下没有理由限制为固定大小,我的观点是在所有情况下都使用
LayoutManager
,没有任何限制,例如

编辑

来自代码(再次使用渲染器在JTables视图中绘制颜色)


您的问题基于代码行(因为我认为
JTable
没有被指定为不可调整大小,可能这是bug,可能是它的特性)

您可以在
渲染器

table.getTableHeader().setBackground(scrollPane.getBackground()); 
我会使用
JTable.AUTO\u RESIZE\u OFF
,在大多数情况下没有理由限制为固定大小,我的观点是在所有情况下都使用
LayoutManager
,没有任何限制,例如

编辑

来自代码(再次使用渲染器在JTables视图中绘制颜色)

他们都没有工作,最后一个带来了NPE

在框架可见之前,表格标题不会实际添加到框架中。此时,scrollpane将从表格中获取表格标题,并将标题添加到scrollpane的列标题中

因此,在框架可见后,可以执行以下操作:

JTableHeader header = table.getTableHeader();
header.getParent().setBackground(Color.YELLOW);
因此,除了设置@mKorbel建议的四个级别外,还需要上述内容

您还可以查看:以获得更详细的答案

他们都没有工作,最后一个带来了NPE

在框架可见之前,表格标题不会实际添加到框架中。此时,scrollpane将从表格中获取表格标题,并将标题添加到scrollpane的列标题中

因此,在框架可见后,可以执行以下操作:

JTableHeader header = table.getTableHeader();
header.getParent().setBackground(Color.YELLOW);
因此,除了设置@mKorbel建议的四个级别外,还需要上述内容


您还可以查看:以获得更详细的答案。

通过您的代码,我还可以在表格标题的右侧获得空白,如图所示:“滚动窗格宽度中没有显示表格标题的部分也设置了颜色”但我指的是从左到右再向后移动其中一列时可以看到的空间。据我所知,您不仅希望表格标题具有白色背景,而且希望整个窗口具有白色背景。尝试将内容窗格背景设置为白色我尝试了
getContentPane().setBackround()
滚动窗格.getViewPort().setBackground()
滚动窗格.setBackground()
滚动窗格。getColumnHeader().setBackground()它们都不起作用,最后一个会带来NPE。编辑:我给了一个颜色作为参数;不用担心。通过你的代码,我还可以在表格标题右侧看到空白。Eras说:“滚动窗格宽度中没有显示表格标题的部分也设置了颜色”但我指的是从左到右再向后移动其中一列时可以看到的空间。据我所知,您不仅希望表格标题具有白色背景,而且希望整个窗口具有白色背景。尝试将内容窗格背景设置为白色我尝试了
getContentPane().setBackround()
滚动窗格.getViewPort().setBackground()
滚动窗格.setBackground()
滚动窗格。getColumnHeader().setBackground()它们都不起作用,最后一个会带来NPE。编辑:我给了一个颜色作为参数;别担心。不幸的是,这并不能解决我的问题。直接复制代码并注释我的结果基本上与我的问题中描述的问题相同。移动列时,仍然可以看到旧背景。可以使用
scrollPane.getViewport().setBackground(Color.WHITE)
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF)的情况下
是必需的,同样,我不会使用
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF)
,让布局经理做自己的工作(我认为这样做是正确的)我无意冒犯你,但你似乎不明白我的问题是什么。。。尝试您作为答案给出的程序(包括
scrollPane.getViewport().setBackground(Color.BLACK);
)并运行它。黑色更好地显示问题。现在在标题处抓住一列并移动它。你会注意到细胞所在的部分,完全是黑色的
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
//http://stackoverflow.com/questions/40969405/change-background-behind-jtable-tableheaders

public class testsforSO extends JFrame {

    private static final long serialVersionUID = -3890178393751567629L;
    private JScrollPane scrollPane = new JScrollPane();
    private String[] columns = new String[]{"ABC", "DEF", "XYZ"};
    private TableModel tm = new DefaultTableModel(columns, 3);
    private JTable table = new JTable(tm);

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    testsforSO frame = new testsforSO();
                    frame.pack();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public testsforSO() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JScrollPane scrollPane = new JScrollPane();
        String[] columns = new String[]{"ABC", "DEF", "XYZ"};
        TableModel tm = new DefaultTableModel(columns, 3);
        //table.getTableHeader().setBackground(Color.WHITE); //Does its job
        table.getTableHeader().setBackground(Color.BLACK);
        table.setFillsViewportHeight(true);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setBackground(Color.BLACK);
        table.setPreferredScrollableViewportSize(new Dimension(300, 100));
        scrollPane.getViewport().setBackground(Color.BLACK);
        scrollPane.setViewportView(table);
        add(scrollPane);
    }
}
JTableHeader header = table.getTableHeader();
header.getParent().setBackground(Color.YELLOW);