Как заменить дочерний компонент JScrollPane - PullRequest
3 голосов
/ 01 октября 2011

У меня есть JPanel, который содержит JScrollPane, который содержит JTable.Внутри моего конструктора панелей он создается следующим образом:

    //inside MyPanel extends JPanel class constructor
public void MyPanel(){
    TitledBorder border = BorderFactory.createTitledBorder("title");
    this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
    this.scrollTable = new JScrollPane(table);
    this.scrollTable.setBorder(border);
}

Теперь пользователь должен иметь возможность загрузить другую таблицу в приложение, поэтому мне нужно удалить предыдущую из панели прокрутки и добавить новую.Я пробовал следующее:

public void setNewTable(JTable t ) {
    this.scrollTable.removeAll();
    this.scrollTable.add(t);
    this.scrollTable.validate();

}

Предыдущая таблица удалена, но внутри JScrollPane ничего не происходит.

Что я делаю не так?

public void

1 Ответ

5 голосов
/ 01 октября 2011

Нельзя просто добавить в JScrollPane, поскольку она состоит из других внутренних компонентов.

Из JavaDocs :

enter image description here

Вызывая scrollPane.removeAll (), вы по существу удаляете заголовок, представление и полосы прокрутки и добавляете компонент, который не понимает область прокрутки.

Прежде всего, вы, как правило, не должны проходить мимо таблиц таким образом. Вместо этого было бы гораздо лучше передать TableModel и изменить модель таблицы с помощью JTable.setModel ().

Тем не менее, если вы абсолютно хотите передать таблицу, вам необходимо установить представление в области просмотра в области прокрутки:

scrollPane.getViewport().setView(table)
...