JAVADEV
JAVADEV

Reputation: 51

Changing JTable header height

Happy new year everyone, i've a problem chaning the height of a JTable header, I appreciate if someone can help. The Method I'am using is changing also the backgroundcolor etc. Thanks

public static void ChangeJTableBackgroundColor(JTable InTable){
    JTable mytable = InTable;
    Color mycolor = new Color(248, 201, 171);
    mytable.setOpaque(true);
    mytable.setFillsViewportHeight(true);
    mytable.setBackground(mycolor);
    Color mycolorhead = new Color(249, 168, 117);
    mytable.getTableHeader().setBackground(mycolorhead);
    mytable.getTableHeader().setPreferredSize(new Dimension(1,50)); 

 }

Upvotes: 1

Views: 1602

Answers (2)

MadProgrammer
MadProgrammer

Reputation: 347332

There are lots of ways you "might" increase the height of the header, which you choose will depend on what you want to achieve. One thing to keep in mind though, is trying to find a solution which respects the diverse rendering environments which you program might need to run in.

You could...

Simple change the font size. This might sound silly, but you'd be surprised at how simple it really is, for example...

DefaultTableModel model = new DefaultTableModel(10, 10);
JTable table = new JTable(model);
JTableHeader header = table.getTableHeader();
header.setFont(header.getFont().deriveFont(30f));

Font size

You could...

Take advantage of Swing's inbuilt HTML support. This example sets up a HTML table with a defined cell height

DefaultTableModel model = new DefaultTableModel(10, 10);
JTable table = new JTable(model);
TableColumnModel columnModel = table.getColumnModel();

String prefix = "<html><body><table><tr><td height=100>";
String suffix = "</td></tr></table></body><html>";
for (int col = 0; col < columnModel.getColumnCount(); col++) {
    TableColumn column = columnModel.getColumn(col);
    String text = prefix + Character.toString((char)('A' + col)) + suffix;
    System.out.println(text);
    column.setHeaderValue(text);
}

Html

You could...

Just supply your own TableCellRenderer as the default cell renderer for the table header. This is a little tricky, as it's difficult to mimic the default renderer used by the current look and feel and the UIManager doesn't help. Instead, you need to consider using a "proxy" approach, where by you apply the changes you need to the existing header renderer instead.

DefaultTableModel model = new DefaultTableModel(10, 10);
JTable table = new JTable(model);
JTableHeader header = table.getTableHeader();
TableCellRenderer proxy = header.getDefaultRenderer();
header.setDefaultRenderer(new TableCellRenderer() {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component comp = proxy.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        if (comp instanceof JLabel) {
            JLabel label = (JLabel) comp;
            label.setBorder(new CompoundBorder(label.getBorder(), new EmptyBorder(50, 0, 50, 0)));
        }
        return comp;
    }
});

Renderer

As far as solutions go, this is probably my preferred, as it takes into account more of the variables involved in determine the preferred size of the column header itself

Upvotes: 7

Rubin bhandari
Rubin bhandari

Reputation: 1951

import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.Arrays;
import javax.swing.*;
import javax.swing.table.*;

public class TableHeaderHeightTest {
  private static int HEADER_HEIGHT = 32;
  private JTable makeTable() {
    JTable table = new JTable(new DefaultTableModel(2, 20));
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    return table;
  }
  public JComponent makeUI() {
    JPanel p = new JPanel(new GridLayout(2,1));

    JTable table1 = makeTable();
    //Bad: >>>>
    JTableHeader header = table1.getTableHeader();
    //Dimension d = header.getPreferredSize();
    //d.height = HEADER_HEIGHT;
    //header.setPreferredSize(d); //addColumn case test
    header.setPreferredSize(new Dimension(100, HEADER_HEIGHT));
    p.add(makeTitledPanel("Bad: JTableHeader#setPreferredSize(...)", new JScrollPane(table1)));
    //<<<<

    JTable table2 = makeTable();
    JScrollPane scroll = new JScrollPane(table2);
    scroll.setColumnHeader(new JViewport() {
      @Override public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        d.height = HEADER_HEIGHT;
        return d;
      }
    });
//         //or
//         table2.setTableHeader(new JTableHeader(table2.getColumnModel()) {
//             @Override public Dimension getPreferredSize() {
//                 Dimension d = super.getPreferredSize();
//                 d.height = HEADER_HEIGHT;
//                 return d;
//             }
//         });
    p.add(makeTitledPanel("Override getPreferredSize()", scroll));

    final List<JTable> list = Arrays.asList(table1, table2);

    JPanel panel = new JPanel(new BorderLayout());
    panel.add(p);
    panel.add(new JButton(new AbstractAction("addColumn") {
      @Override public void actionPerformed(ActionEvent e) {
        for(JTable t: list) {
          t.getColumnModel().addColumn(new TableColumn());
          JTableHeader h = t.getTableHeader();
          Dimension d = h.getPreferredSize();
          System.out.println(d);
        }
      }
    }), BorderLayout.SOUTH);
    panel.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
    return panel;
  }
  private static JComponent makeTitledPanel(String title, JComponent c) {
    JPanel p = new JPanel(new BorderLayout());
    p.add(c);
    p.setBorder(BorderFactory.createTitledBorder(title));
    return p;
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new TableHeaderHeightTest().makeUI());
    f.setSize(320, 320);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}

Try this

Upvotes: 0

Related Questions