как создать пользовательский JTable в Java с строкой над именами столбцов - PullRequest
0 голосов
/ 17 июля 2011

Я использую AbstractTableModel для создания простой настраиваемой таблицы, как обычно со String [] для имен столбцов и Object [] [] для содержимого в JTable's строках. Но мне было трудно создайте таблицу, содержащую дополнительную строку (из одной большой ячейки, охватывающей все столбцы для общего заголовка) перед именами столбцов. У кого-нибудь есть идеи?

Ответы [ 2 ]

1 голос
/ 17 июля 2011

Зависит от того, как вы хотите, чтобы ваш общий заголовок выглядел.

Вы можете легко добавить 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 );
1 голос
/ 17 июля 2011

с помощью BorderLayout вы можете поместить TableHeader в нижнюю часть Container

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