использование JTable в качестве заголовка столбца JScrollPane при сохранении ширины каждого столбца

просто ищу быстрый ответ: можно ли использовать JTable в качестве заголовка столбца JScrollPane?

У меня есть настроенный JTable с другой шириной столбца и заголовком столбца, и я планирую использовать заголовок в качестве заголовка столбца области прокрутки. Как я могу этого добиться? я накрываю на стол с

scrollPane.setColumnHeaderView(table);

но он не появляется.

так что спасибо Гийому Полету, так и должно быть

scrollpane.setColumnHeaderView(table.getTableHeader());

но теперь все столбцы имеют одинаковую ширину, хотя я установил для них разные значения в своей таблице. Как я могу позволить столбцам таблицы показывать разную ширину?


person boreas    schedule 23.10.2012    source источник
comment
Я думаю, тебе стоит отредактировать свой пост. Я не знаю, чего вы пытаетесь достичь.   -  person Robin    schedule 23.10.2012
comment
Я просто пытаюсь установить ColumnHeader JScrollPane с JTable, который содержит 0 строк и только заголовок.   -  person boreas    schedule 23.10.2012
comment
JLabel может быть установлен как ColumnHeader, но я не понимаю, почему JTable не может.   -  person boreas    schedule 23.10.2012
comment
Пожалуйста, покажите нам код. Я изменил пример из java2s.com/Code/Java/Swing. -JFC/ и JTable как columnHeader работают нормально (однако есть проблемы с размерами компонентов)   -  person    schedule 23.10.2012
comment
@boreas, поскольку (@Robin) упомянул публикацию SSCCE   -  person mKorbel    schedule 23.10.2012
comment
Работает ли это с JTable, у которого есть хотя бы 1 строка?   -  person Robin    schedule 23.10.2012


Ответы (1)


Если я вас правильно понял, вы хотите, чтобы заголовки столбцов вашей таблицы отображались в заголовках столбцов области просмотра, но вы хотите что-то еще в представлении области просмотра?

Затем вам нужно взять заголовок таблицы и установить его в качестве заголовка столбца окна просмотра.

Вот пример:

import java.awt.BorderLayout;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestTableHeader {

    protected void initUI() {
        Vector<Vector<Object>> data = new Vector<Vector<Object>>();
        Vector<String> colNames = new Vector<String>();
        for (int i = 0; i < 5; i++) {
            colNames.add("Col-" + (i + 1));
        }

        table = new JTable(data, colNames);
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        scrollpane = new JScrollPane();
        scrollpane.setColumnHeaderView(table.getTableHeader());
        scrollpane.setViewportView(new JLabel("some label in the viewport view"));
        frame.add(scrollpane, BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    private JTable table;
    private JScrollPane scrollpane;

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            UnsupportedLookAndFeelException {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTableHeader().initUI();
            }
        });
    }

}
person Guillaume Polet    schedule 23.10.2012
comment
Спасибо, Гийом Полет! Это почти работает, только одна проблема: у меня есть особые требования к ширине каждого столбца, они разные, и я установил их в своей таблице. но когда я использую scrollpane.setColumnHeaderView(table.getTableHeader()); все столбцы будут иметь одинаковую ширину. есть идеи, как этого избежать? - person boreas; 23.10.2012
comment
Я только что попробовал с JTableHeader, тоже не работает, но все столбцы имеют одинаковую ширину. - person boreas; 23.10.2012
comment
@boreas Вы можете получить доступ к TableColumModel и установить предварительную/минимальную/максимальную ширину столбца базовых столбцов. - person Guillaume Polet; 23.10.2012
comment
еще раз спасибо! теперь это должен быть последний вопрос: мне может понадобиться использовать setMinWidth и setMaxWidth, чтобы отобразить столбец с указанной шириной, но в этом случае я больше не могу изменять ширину таблицы в приложении. Но мне нужно. Ширина каждого столбца - это продолжительность каждого элемента на графике ниже (в окне просмотра панели прокрутки), и мне нужно иметь возможность изменять их, когда продолжительность времени неверна. так как я могу изменить ширину? - person boreas; 24.10.2012
comment
Выполнено. установите минимальное/максимальное значение после установки TableHeader в ColumnHeader панели прокрутки. - person boreas; 24.10.2012
comment
@boreas вам не нужна таблица для создания экземпляра заголовка (на самом деле это может помешать позже, поскольку заголовок содержит ссылку на эту таблицу) Вместо создания цикла для создания имен столбцов для таблицы foo TableModel цикл для создания TableColumns и добавьте их в TableColumnModel. - person kleopatra; 24.10.2012
comment
@kleopatra Да, я тоже об этом думал, но мне было интересно, действительно ли он использовал содержимое таблицы где-то еще, и в этом случае было приемлемо создать целую JTable - person Guillaume Polet; 24.10.2012