如何在Java中构建自定义JTable,在列名称上方有一行

时间:2011-07-16 22:31:34

标签: java swing jtable jtableheader

我正在使用AbstractTableModel创建一个简单的自定义表,像往常一样,String []用于列名,而Object [] []用于JTable's行。但是,我发现很难在列名称之前创建一个包含额外行(一个大单元格跨越一般标题的所有列)的表格。有没有人有任何想法?

2 个答案:

答案 0 :(得分:1)

使用BorderLayout,您可以将TableHeader放在Container

的底部
add(table, BorderLayout.CENTER);
add(header, BorderLayout.SOUTH);

答案 1 :(得分:1)

这取决于你想要的总标题。

您可以在单独的面板中轻松地在表格上方添加JLabel。类似的东西:

JPanel tablePanel = new JPanel( new BorderLayout() );
JLabel label = new JLabel( "Table Title" );
label.setHorizontalAlignment( JLabel.CENTER );
tablePanel.add(label, BorderLayout.NORTH);
JTable table = new JTable(...);
JScrollPane scrollPane = new JScrollPane( table );
tablePanel.add(scrollPane, BorderLayout.CENTER);

如果您希望标题实际上是列标题的一部分,那么它有点棘手。一种方法是这样的:

JTable table = new JTable(...)
{
    @Override
    protected void configureEnclosingScrollPane()
    {
        super.configureEnclosingScrollPane();

        Container parent = getParent();

        if (parent instanceof JViewport)
        {
            parent = parent.getParent();

            if (parent instanceof JScrollPane)
            {
                JScrollPane scrollPane = (JScrollPane)parent;

                JPanel columnHeader = new JPanel( new BorderLayout() );
                JLabel label = new JLabel( "Table Title" );
                label.setHorizontalAlignment( JLabel.CENTER );
                columnHeader.add(label, BorderLayout.NORTH);
                columnHeader.add(getTableHeader(), BorderLayout.CENTER);
                scrollPane.setColumnHeaderView( columnHeader );
            }
        }
    }
};
JScrollPane scrollPane = new JScrollPane( table );
add( scrollPane );