动态更改嵌套的Swing组件

时间:2011-07-12 17:47:54

标签: java swing jscrollpane

以下是我的问题:我的JPanel包含JTabbedPaneJScrollPane使用自定义JPanel infoScroller.remove(infoPanel); this.reevaluateInfoPanel(); infoScroller.setViewportView(infoPanel); infoScroller.revalidate(); infoScroller.repaint(); 。很简单,我将自定义JPanel更改为我的程序,我需要所有父组件来反映更改。但是,我不知道我需要使用什么来实现这一目标。这就是我现在所拥有的:

infoScoller

其中JScrollPaneinfoPanelJPanel是自定义的| Hi! |

应该说| Bye! |(或类似的东西,你明白了)说| Hi! |,而是从| |转到private void reevaluateInfoPanel(){ infoPanel = new JPanel(); GridLayout gl = new GridLayout(infoNum, 1); infoPanel.setLayout(gl); //Create a display panel for every info block available DisplayPanel[] panels = new InfoViewer[infoList.length]; for(int i = 0; i < panels.length; i++){ panels[i] = new InfoViewer(infoList[i]); } //Assign a new SelectionPanel for every info selection necessary for(int i = 0; i < infoNum; i++){ infoPanel.add(new SelectionPanel(panels, "info")); } }

编辑:通过自定义我的意思是它扩展了JPanel,并且有一些组件等.reevaluateInfoPane()根据新信息将infoPanel设置为等于新的infoPanel。我知道reevalutateInfoPanel()做我想要的,因为我可以说它是一个新的JFrame而且它是正确的......无论如何这里是代码......这可能会比帮助更混乱,因为它确实没有必要...

JTabbedPane

更新:我已经发现问题出在JScrollPane的某处,而不是呈现更新的revalidate。相反,当我repaintJTabbedPane({{1}})时,它会完全删除它。

2 个答案:

答案 0 :(得分:0)

您应该在更改的容器上调用revalidate()repaint()。从描述中可以看出,您应该在infoPanel上调用它们。另外,请确保您的调用发生在事件调度线程上。

也许看看如何更改infoPanel的内容会很有帮助。

答案 1 :(得分:0)

正如已经建议的那样,在父组件上调用revalidate()repaint()就足够了。它会自动将重新验证和重新绘制传播到该组件内的所有组件。