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



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

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

add(table, BorderLayout.CENTER);
add(header, BorderLayout.SOUTH);

这取决于你想要的标题。

您可以轻松地在表上方的单独面板中添加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 );

最新更新