编程语言
首页 > 编程语言> > Java JTable标题自动换行

Java JTable标题自动换行

作者:互联网

我试图让表格上的标题有自动换行.我已设法做到这一点,但第一个数据行正在扩展.该表的代码是:

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.如果我取出代码,我得到一个普通的表,但没有包装在标题上.这是一个公认的问题还是我错过了什么?

任何帮助赞赏

解决方法:

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

与许多Swing组件一样,您可以使用HTML代码.在HTML中指定< br>用于指示换行/换行的位置的元素.

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

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

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

注意:标题高度将由第一列的高度决定.因此,您必须为第一列使用2行HTML值.如果第一列只有一个单词,您可以另外添加一个空的第二行,如下所示:“< html>选择< br>& nbsp;< / html>”

标签:java,swing,jtable,jtableheader,tablecellrenderer
来源: https://codeday.me/bug/20190612/1224408.html