How to set JLabel background and border the same as table header?

I want to recreate the table title using JLabel . The appearance of JLabel must be exactly the same as the JTableHeader specified by the system.

This is what I have tried so far:

 JLabel header = new JLabel("Title"); header.setOpaque(true); header.setBackground(UIManager.getColor(new JTableHeader().getBackground())); header.setBorder(UIManager.getBorder(new JTableHeader().getBorder())); 

But UIManager returns null for color and border.

Any ideas?

Here's how I installed Look and Feel:

 javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName()); 
+2
source share
4 answers

There are more problems than just getting the color and border of the table title. Each cell / column is displayed with a TableCellRenderer , meaning that the values ​​returned by the UIManager can be ignored ...

For example, the following displays a JTableHeader and applies a border / background to a JLabel based on the values ​​returned by the UIManager under the Look and Feel ...

enter image description here

As you can see, there is a difference between them.

Be that as it may, if everything you are interested in displays a "group header" of some kind on top of another component in the scroll bar, you can simply add a JTableHeader to the scroll column column directly ...

enter image description here

 public class TestHeader { public static void main(String[] args) { new TestHeader(); } public TestHeader() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } TableColumnModel model = new DefaultTableColumnModel(); final TableColumn column = new TableColumn(0, 250); column.setHeaderValue("Test"); model.addColumn(column); JTableHeader header = new JTableHeader(); header.setColumnModel(model); final JTextArea textArea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textArea); scrollPane.setColumnHeaderView(header); textArea.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { column.setWidth(textArea.getWidth()); } }); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(scrollPane); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } } 

UPDATED

enter image description here

 public class TestHeader { public static void main(String[] args) { new TestHeader(); } public TestHeader() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } TableColumnModel model = new DefaultTableColumnModel(); final TableColumn column = new TableColumn(0, 250); column.setHeaderValue("I don't see the problem"); model.addColumn(column); final JTableHeader header = new JTableHeader(); header.setColumnModel(model); DefaultTableModel tm = new DefaultTableModel(new Object[]{"A", "B", "C"}, 0); tm.addRow(new Object[]{"1", "2", "3", "4"}); tm.addRow(new Object[]{"5", "6", "7", "8"}); tm.addRow(new Object[]{"9", "10", "11", "12"}); tm.addRow(new Object[]{"13", "14", "15", "16"}); final JTable table = new JTable(tm); final JScrollPane scrollPane = new JScrollPane(table); /** * For some reason, the header isn't being applied as soon as the * table is added to the scroll pane, so we need to jump our next * request to the end of the of event queue so that it will * occur some time in the future */ SwingUtilities.invokeLater(new Runnable() { @Override public void run() { scrollPane.setColumnHeaderView(header); } }); table.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { column.setWidth(table.getWidth()); } }); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(scrollPane); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } } 
+4
source

You need to set the appearance of the application before you try:

 header.setBackground(UIManager.getColor(new JTableHeader().getBackground())); header.setBorder(UIManager.getBorder(new JTableHeader().getBorder())); 

you should first look like this:

  try { for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (Exception e) { // If Nimbus is not available, you can set the GUI to another look and feel. } 

Here is an example:

enter image description here

 import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.table.JTableHeader; public class Test { public Test() { initComponents(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { //set nimbus look and feel for (UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e.printStackTrace(); } new Test(); } }); } private void initComponents() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JLabel header = new JLabel("Title"); header.setBackground(UIManager.getColor(new JTableHeader().getBackground())); header.setBorder(UIManager.getBorder(new JTableHeader().getBorder())); frame.add(header); frame.pack(); frame.setVisible(true); } } 
+2
source

Try using the default UIManager :

 Color color = UIManager.getColor("TableHeader.background"); Border border = UIManager.getBorder("TableHeader.CellBorder"); 
+2
source

I decided that I would create a JTable without any lines and place a JTextPane at the bottom right. And it works like a charm.

 JTextPane textPane = new JTextPane(); JPanel panel = new JPanel(new BorderLayout()); JTable table = new JTable(0, 1); table.setPreferredScrollableViewportSize(new Dimension(600, 0)); JScrollPane js = new JScrollPane(table) panel.add(js, BorderLayout.NORTH); panel.add(new JScrollPane(textPane),BorderLayout.CENTER); 
0
source

All Articles