Java JTable头换行

Java JTable头换行,java,swing,jtable,tablecellrenderer,jtableheader,Java,Swing,Jtable,Tablecellrenderer,Jtableheader,我试图得到一个表的标题有字包装。我已经设法做到了这一点,但第一个数据行正在扩展。该表的代码为: public class GenerateTable extends JTable { private JCheckBox boxSelect = new JCheckBox(); private JTableHeader hdGen; public class LineWrapCellRenderer extends JTextArea implements TableC

我试图得到一个表的标题有字包装。我已经设法做到了这一点,但第一个数据行正在扩展。该表的代码为:

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

    }

}
公共类GenerateTable扩展了JTable{
私有JCheckBox box选择=新JCheckBox();
专用JTableHeader-hdGen;
公共类LineWrapCellRenderer扩展了JTextArea,实现了TableCellRenderer{
私有静态最终长serialVersionUID=1L;
int rowHeight=0;//此扫描的当前最大行高
@凌驾
公共组件GetTableCellRenderComponent(
JTable表,
对象值,
他当选了,,
布尔聚焦,
int row,
int列)
{
/*
*行<0表示标题
*/
如果(行>=0){
setWrapStyleWord(false);
归还这个;
}
setText((字符串)值);
setWrapStyleWord(true);
setLineWrap(真);
//当前表格列宽(像素)
int colWidth=table.getColumnModel().getColumn(column).getWidth();
//设置文本区域宽度(此处高度无关紧要)
设置尺寸(新尺寸(colWidth,1));
//获取文本区域的首选高度并添加行边距
int height=getPreferredSize().height+table.getRowMargin();
//确保行高适合大多数行的单元格,行=-1表示页眉
如果(列==2 | |高度>行高度){
表.设置行高(行高);
行高=高度;
} 
归还这个;
}
}
LineWrapCellRenderer lwHeader=新的LineWrapCellRenderer();
公共GenerateTable(GenerateTableModel模型){
超级(模型);
此.setSelectionMode(ListSelectionModel.SINGLE_选择);
/*
*挑选
*/
TableColumn colSelect=this.getColumnModel().getColumn(0);
setCellEditor(新的DefaultCellEditor(boxSelect));
colSelect.setPreferredWidth(60);
/*
*类别
*/
this.getColumnModel().getColumn(1).setResizeable(false);
this.getColumnModel().getColumn(1).setPreferredWidth(200);
/*
*金额值
*/

对于(inti=2;i您可以更轻松地实现多行标题

与许多Swing组件一样,您可以使用HTML代码。在HTML中指定

元素以指示换行/新行应该出现的位置

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

String[]列名称={
“第一列”,
“第二列”,
“第三列”
};
然后标题将在两行中正确呈现。您甚至不需要创建/使用自定义标题呈现器,默认标题呈现器可以正确处理HTML代码


注意:页眉高度将由第一列的高度决定。因此,您也必须为第一列使用两行HTML值。如果第一列只有一个单词,您还可以添加一个空的第二行,如下所示:
“选择

2014年5月1日-2014年5月31日==2014年5月31日收割台高度的静态尺寸如何?
setSize(新尺寸(colWidth,26));
在任何情况下,收割台网格单元格的底线似乎都需要多一点空间:
表格。setRowHeight(行,高度+2)
谢谢Joop,我考虑过这个问题,但仍然不明白为什么第一行数据会扩展这么多。谢谢icza,我喜欢这种简单的方法。效果很好。
String[] columnNames = {
    "<html>First<br>column</html>",
    "<html>Second<br>column</html>",
    "<html>Third<br>column</html>"
};