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);