JFrame中的Java-replace组件

JFrame中的Java-replace组件,java,swing,Java,Swing,我正在努力使用java GUI-感谢您提前提供的帮助!我有一个JFrame,其中有几个组件:按钮(Jbutton)触发动作监听器,comp这是一个组件,我试图用其中的组件替换JScrollPane(不管是什么类型的组件,可以是文本字段、表格或任何东西) 我想触发一个操作-删除组件,将一个新组件放在与已删除组件相同的位置,然后重新绘制窗口(我使用它来显示不同类型的文本字段和JTable)。这就是我所拥有的: JScrollPane sp = new JScrollPane(comp); this.

我正在努力使用java GUI-感谢您提前提供的帮助!我有一个JFrame,其中有几个组件:按钮(Jbutton)触发动作监听器,comp这是一个组件,我试图用其中的组件替换JScrollPane(不管是什么类型的组件,可以是文本字段、表格或任何东西)

我想触发一个操作-删除组件,将一个新组件放在与已删除组件相同的位置,然后重新绘制窗口(我使用它来显示不同类型的文本字段和JTable)。这就是我所拥有的:

JScrollPane sp = new JScrollPane(comp);
this.add(sp, BorderLayout.CENTER);
//this works so far - first time I display this is ok!

private void replace() {
 comp = new Component(...); //name and type of the components is not important
 sp = new JSCrollPane(comp);
 this.remove(sp); //remove old component
 add(sp, BorderLayout.CENTER);
 repaint();
 revalidate();
}
为什么功能不能代替工作?它什么也不做(它在逻辑上改变了组件,所以如果我访问comp的内容,它会被刷新,但它仍然显示旧的内容)

我写的有点象徵性,因为我的代码很长。。。谢谢你的帮助!
编辑:我的代码中忘记了一行。

您不必像以前那样尝试删除滚动窗格

要更改滚动窗格显示的组件,只需进行以下调用:

sp.setViewportView(new Component(...));
在该调用之后,旧组件将从视图中移除并替换为新组件

因此,您的代码应该有点像这样:

JScrollPane sp = new JScrollPane(comp);
this.add(sp, BorderLayout.CENTER);

private void replace() {
    comp = new Component(...); //name and type of the components is not important
    sp.setViewportView(comp);
}

从代码的外观来看,您添加的第一个滚动窗格(this.add)与删除的滚动窗格(this.remove)不同。测试从remove返回的布尔值,以查看它是否实际已被删除。我想你会发现事实并非如此。

有一个解决方案:


看看这是否适合你。我自己没有尝试过…

这是个错误,我应该先删除sp,然后创建它,然后再添加它。。。
jpanel.remove(component); //remove component from your jpanel in this case i used jpanel 
jpanel.revalidate(); 
jframe.repaint();//repaint a JFrame jframe in this case 

to add: 
jpanel.add(component); //add component to jpanel in this case i used jpanel 
jpanel.revalidate(); 
jframe.repaint();//repaint a JFrame jframe in this case