Java JTable 标头自动换行

Posted

技术标签:

【中文标题】Java JTable 标头自动换行【英文标题】:Java JTable header word wrap 【发布时间】:2014-11-30 13:49:39 【问题描述】:

我正在尝试让表格上的标题进行自动换行。我已经设法做到了,但第一个数据行正在扩展。表格的代码是:

public class GenerateTable extends JTable 

    private JCheckBox boxSelect = new JCheckBox();
    private JTableHeader hdGen;

    public class LineWrapCellRenderer extends JTextArea implements TableCellRenderer 

        private static final long serialVersionUID = 1L;
        int rowHeight = 0;  // current max row height for this scan
        @Override
        public Component getTableCellRendererComponent(
                JTable table,
                Object value,
                boolean isSelected,
                boolean hasFocus,
                int row,
                int column)
        
            /*
             * row < 0 means header
             */
            if(row >= 0) 
                setWrapStyleWord(false);
                return this;
            
            setText((String) value);
            setWrapStyleWord(true);
            setLineWrap(true);
            // current table column width in pixels
            int colWidth = table.getColumnModel().getColumn(column).getWidth();

            // set the text area width (height doesn't matter here)
            setSize(new Dimension(colWidth, 1)); 

            // get the text area preferred height and add the row margin
            int height = getPreferredSize().height + table.getRowMargin();
            // ensure the row height fits the cell with most lines, row = -1 for header
            if (column == 2 || height > rowHeight) 
                table.setRowHeight(row, height);
                rowHeight = height;
             
            return this;
        
    
    LineWrapCellRenderer lwHeader = new LineWrapCellRenderer();
    public GenerateTable(GenerateTableModel model) 
        super(model);
        this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        /*
         * Select
         */
        TableColumn colSelect = this.getColumnModel().getColumn(0);
        colSelect.setCellEditor(new DefaultCellEditor(boxSelect));
        colSelect.setPreferredWidth(60);
        /*
         * category
         */
        this.getColumnModel().getColumn(1).setResizable(false);
        this.getColumnModel().getColumn(1).setPreferredWidth(200);
        /*
         * Amount values
         */
        for (int i=2;i<model.getColumnCount();i++) 
            colSelect = this.getColumnModel().getColumn(i);
            colSelect.setPreferredWidth(100);
            colSelect.setResizable(false);
            colSelect.setHeaderRenderer(lwHeader);
        

    


输出是:

我已在调试中跟踪代码,并且没有为数据线调用 LineWrapCellRenderer。如果我把代码拿出来,我会得到一张普通的桌子,但标题上没有换行。这是公认的问题还是我遗漏了什么?

任何帮助表示赞赏

【问题讨论】:

01/05/2014 - 31/05/2014 == 2014 年 5 月 标题高度的静态尺寸怎么样? setSize(new Dimension(colWidth, 26)); 在每种情况下,标题网格单元格的底线似乎都需要一点额外的空间:table.setRowHeight(row, height + 2); 谢谢Joop,我想过这个,但还是不明白为什么第一行数据扩展了这么多。 【参考方案1】:

您可以更轻松地实现多行标题。

与许多 Swing 组件一样,您可以使用 html 代码。在 HTML 中指定 &lt;br&gt; 元素以指示应该在哪里出现换行符/换行符。

例如,如果您使用以下标题值(列名):

String[] columnNames = 
    "<html>First<br>column</html>",
    "<html>Second<br>column</html>",
    "<html>Third<br>column</html>"
;

然后标题将正确呈现为 2 行。您甚至不需要创建/使用自定义标题渲染器,默认标题渲染器可以正确处理 HTML 代码。

注意:标题高度将由第一列的高度决定。因此,您也必须为第一列使用 2 行 HTML 值。如果第一列只有一个单词,则可以另外添加一个空的第二行,如下所示:"&lt;html&gt;Select&lt;br&gt;&amp;nbsp;&lt;/html&gt;"

【讨论】:

谢谢icza,我喜欢简单的方法。效果很好。

以上是关于Java JTable 标头自动换行的主要内容,如果未能解决你的问题,请参考以下文章

JTable单元格自动换行

JTable Multiline cell自动换行[复制]

java swing JTable显示问题

java生成excel内容超出列宽自动换行

使用Java生成XML文件时,如何能让文件自动换行?

java中的textarea 怎么自动换行