设置 JTableHeader 持有者背景颜色
Setting JTableHeader holder background colour
我的程序中有一个 JTable
,我想更改 JTableHeader
的颜色。我使用以下代码完成了此操作
JTableHeader header = table.getTableHeader();
header.setBackground(Color.WHITE);
但是,当我拖动 header 时,我注意到 header 后面有一个灰色区域,如下图所示。
如何将其设置为白色以使其适合我的 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();
}
}
);
}
}
正如我所料,我们需要将 header 的 parent 设置为您想要的背景颜色。
然而,滚动窗格并不是我预期的 header 的 parent。
当我添加如下代码时:
System.out.println( header.getParent() );
它显示了一个 JViewport 作为 parent 这让我很困惑。
但是当我添加时:
System.out.println( scroll.getViewport() );
我注意到两个视口不同。所以看起来滚动窗格的视口与 header.
的视口不同
所以问题的解决方法是:
JTableHeader header = table.getTableHeader();
header.setBackground(Color.GREEN);
然后 在 框架可见之后,您可以执行以下操作:
header.getParent().setBackground(Color.YELLOW);
(我用了不同的颜色只是为了展示每条语句的效果)
请注意 header 在框架打包或可见之前不会添加到滚动窗格。如果您尝试在创建 table 时设置背景,您将在尝试访问 parent.
时收到 NPE
或者另一种选择是将 AncestorListener
添加到 JTableHeader
。然后可以调用代码然后将 header 添加到可见框架。对于这种类型的方法,请查看 Dialog Focus
中的 Request Focus Listener
我的程序中有一个 JTable
,我想更改 JTableHeader
的颜色。我使用以下代码完成了此操作
JTableHeader header = table.getTableHeader();
header.setBackground(Color.WHITE);
但是,当我拖动 header 时,我注意到 header 后面有一个灰色区域,如下图所示。
如何将其设置为白色以使其适合我的 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();
}
}
);
}
}
正如我所料,我们需要将 header 的 parent 设置为您想要的背景颜色。
然而,滚动窗格并不是我预期的 header 的 parent。
当我添加如下代码时:
System.out.println( header.getParent() );
它显示了一个 JViewport 作为 parent 这让我很困惑。
但是当我添加时:
System.out.println( scroll.getViewport() );
我注意到两个视口不同。所以看起来滚动窗格的视口与 header.
的视口不同所以问题的解决方法是:
JTableHeader header = table.getTableHeader();
header.setBackground(Color.GREEN);
然后 在 框架可见之后,您可以执行以下操作:
header.getParent().setBackground(Color.YELLOW);
(我用了不同的颜色只是为了展示每条语句的效果)
请注意 header 在框架打包或可见之前不会添加到滚动窗格。如果您尝试在创建 table 时设置背景,您将在尝试访问 parent.
时收到 NPE或者另一种选择是将 AncestorListener
添加到 JTableHeader
。然后可以调用代码然后将 header 添加到可见框架。对于这种类型的方法,请查看 Dialog Focus
Request Focus Listener