改变JTable TableHeaders背后的背景

gei*_*aos 1 java swing background jtable

我有一个带有几个表和白色应用程序背景的应用程序,可以与使用过的徽标混合使用.我已经将所有背景设置为白色但是到目前为止还有一个我无法达到的空间.
使用标准JTable我可以移动列,这是完全没问题的.但是,移动列时,您仍然可以看到TableHeaders背后的标准应用程序颜色.在JScrollPane中显示我认为设置背景ScrollPane.getContentHeader()会有所帮助,但我得到了一个N​​PE.

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

移动三列中的一列时,您会注意到LAF的标准背景(对我而言,它是标准的Windows LAF,其颜色为米色)而不是白色,而TableHeader的背景设置为白色.
对于没有显示表头的scrollPane宽度部分也设置了颜色,并将标题的颜色设置为正确的颜色,但我无法弄清楚如何对标题后面的空间执行此操作.

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

不幸的是你看不到光标,但是我在它的标题处按住了列并将其拖到右边.

mKo*_*bel 5

你的问题是基于代码行的(因为我认为JTable没有指定为non_resizable,也许这可能是bug的特征)

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
Run Code Online (Sandbox Code Playgroud)

你可以覆盖这个绘画人工制品,然后覆盖所需ColorRenderer

table.getTableHeader().setBackground(scrollPane.getBackground()); 
Run Code Online (Sandbox Code Playgroud)

我会使用JTable.AUTO_RESIZE_OFF,在大多数情况下没有理由限制在固定大小,我的观点是LayoutManager在所有情况下使用,没有任何限制,例如

在此输入图像描述

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(scrollPane.getBackground());
        table.getTableHeader().setOpaque(true);
        table.setFillsViewportHeight(true);
        //table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setPreferredScrollableViewportSize(new Dimension(300, 100));
        scrollPane.setViewportView(table);
        add(scrollPane);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

Try your program you gave as an answer (including scrollPane.getViewport().setBackground(Color.BLACK);) and run it. Black shows the problem better.
Run Code Online (Sandbox Code Playgroud)

查看

在此输入图像描述

从代码(再次使用Renderer绘制JTables视图中的颜色)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)