【问题标题】:How to change JTable header height?如何更改 JTable 标题高度?
【发布时间】:2012-07-26 01:22:16
【问题描述】:

标题解释了这个问题。我怎样才能轻松做到这一点?

【问题讨论】:

    标签: java swing jtable jtableheader preferredsize


    【解决方案1】:
    Font bigFont = new Font("sansserif", Font.PLAIN, 24); // or whatever
    myTable.getTableHeader().setFont(bigFont);
    

    这是增加TableHeader 的preferredSize 的简单方法。它会增加标题的高度,但如果你的列名太长,那么它们可能不适合宽度。

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    【解决方案2】:

    您可以设置首选宽度,而不是像 aterai 回答那样覆盖 JViewport.getPreferredSize。

    JScrollPane scroll = new JScrollPane(table2);
    scroll.getColumnHeader().setPreferredSize(new Dimension(0, HEADER_HEIGHT));
    

    JScrollPane 忽略列标题宽度,因此您可以在此处安全地设置为零。

    【讨论】:

      【解决方案3】:

      试试这个

      JTableHeader th = table.getTableHeader();
      th.setPreferredSize(new Dimension(100, 100));
      

      【讨论】:

        【解决方案4】:

        试试这个.....

        if jtable attached to scrollpane 
          then 
        table.getTableHeader().setPreferredSize(
             new Dimension(scrollpane.getwidth(),height)
        );
        
        else
          table.getTableHeader().setPreferredSize(
             new Dimension(width,height)
        );
        

        【讨论】:

        • 如果我按照你的方式做,那么表格的标题不会随行滚动。如果我按照 aterai 的方式进行操作,那么标题会随着行滚动。
        【解决方案5】:

        您还可以在设置首选标题尺寸时使用非常大的宽度,该尺寸会根据列模型中所需的宽度进行截断。

        tableHeader.setPreferredSize(new Dimension(10000, HEADER_HEIGHT));
        

        【讨论】:

        【解决方案6】:

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

        【讨论】:

        • mKorbel thx :),kleopatra “不使用 setXXSize”,这是肯定的。
        • @aterai 这很好,真的很好。我以前用过“坏”的方法,遇到了你上面显示的那个问题。实际上无法弄清楚是什么原因..非常感谢,感谢您的努力!
        猜你喜欢
        • 1970-01-01
        • 2013-09-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2011-06-06
        • 2011-05-23
        • 2010-12-21
        • 2013-07-16
        相关资源
        最近更新 更多