[英]Dynamically change nested Swing component
这是我的问题:我有一个JPanel
,其中包含一个JTabbedPane
,它有一个使用自定义JPanel
的JScrollPane
。 很简单,我将自定义 JPanel 更改为我的程序的一种方式,并且我需要所有父组件来反映更改。 但是,我不知道我需要使用什么来完成此操作。 这就是我现在所拥有的:
infoScroller.remove(infoPanel);
this.reevaluateInfoPanel();
infoScroller.setViewportView(infoPanel);
infoScroller.revalidate();
infoScroller.repaint();
其中infoScoller
是JScrollPane
, infoPanel
是自定义的JPanel
。
应该是 go 从说| Hi! |
| Hi! |
(或类似的东西,你明白了)说| Bye! |
| Bye! |
但它来自| Hi! |
| Hi! |
到| |
| |
编辑:通过自定义,我的意思是它扩展了 JPanel,并具有一些组件等。 reevaluateInfoPane() 根据新信息将 infoPanel 设置为等于新的 infoPanel。 我知道 reevalutateInfoPanel() 可以满足我的要求,因为我可以说它是一个新的 JFrame 并且它是正确的......无论如何这里是代码......这可能会比帮助更令人困惑,因为它真的没有必要...
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"));
}
}
更新:我发现问题出在JTabbedPane
的某个地方,它没有呈现更新的JScrollPane
。 相反,当我revalidate
并repaint
它( JTabbedPane
)时,它只是将它完全删除。
您应该在您更改的容器上调用revalidate()
和repaint()
。 从描述中,听起来您应该在infoPanel
上调用它们。 此外,请确保您的调用发生在事件调度线程上。
看看您如何更改infoPanel
的内容也许会有所帮助。
正如已经建议的那样,在父组件上调用revalidate()
和repaint()
就足够了。 它会自动将重新验证和重新绘制传播到该组件内的所有组件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.