0

我正在使用 AbstractTableModel创建一个简单的自定义表,像往常一样使用 String[] 作为列名,使用 Object[][] 作为JTable's行中的内容。但是,我发现很难创建一个包含额外行的表(一个大单元格,跨越所有列的一般标题)在列名之前。有人有什么主意吗?

4

2 回答 2

1

通过使用BorderLayout你可以放置TableHeader到底部Container

add(table, BorderLayout.CENTER);
add(header, BorderLayout.SOUTH);
于 2011-07-16T22:52:09.933 回答
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 );
于 2011-07-17T03:16:42.163 回答