如何替换JScrollPane子组件

Hei*_*bug 3 java swing jtable jscrollpane

我有一个JPanel,其中包含一个包含JTable的JScrollPane.在我的面板构造函数中,它是这样创建的:

    //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);
}
Run Code Online (Sandbox Code Playgroud)

现在,用户应该能够将另一个表加载到应用程序中,因此我需要从滚动窗格中删除前一个表并添加一个新表.我尝试过以下方法:

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

}
Run Code Online (Sandbox Code Playgroud)

删除了上一个表,但现在JScrollPane中没有任何内容.

我究竟做错了什么?

公共无效

Rev*_*nzo 5

您不能只添加到JScrollPane,因为它包含其他内部组件.

来自JavaDocs:

在此输入图像描述

通过主要调用scrollPane.removeAll(),删除标题,视图和滚动条,并添加滚动窗格不理解的组件.

首先,您通常不应该以这种方式传递表格.相反,传入TableModel并通过JTable.setModel()更改表上的模型会好得多.

也就是说,如果您绝对想要传入表格,则需要在滚动窗格中的视口上设置视图:

scrollPane.getViewport().setView(table)
Run Code Online (Sandbox Code Playgroud)