以下是我的问题:我的JPanel
包含JTabbedPane
,JScrollPane
使用自定义JPanel
infoScroller.remove(infoPanel);
this.reevaluateInfoPanel();
infoScroller.setViewportView(infoPanel);
infoScroller.revalidate();
infoScroller.repaint();
。很简单,我将自定义JPanel更改为我的程序,我需要所有父组件来反映更改。但是,我不知道我需要使用什么来实现这一目标。这就是我现在所拥有的:
infoScoller
其中JScrollPane
是infoPanel
而JPanel
是自定义的| 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
。相反,当我repaint
和JTabbedPane
({{1}})时,它会完全删除它。
答案 0 :(得分:0)
您应该在更改的容器上调用revalidate()
和repaint()
。从描述中可以看出,您应该在infoPanel
上调用它们。另外,请确保您的调用发生在事件调度线程上。
也许看看如何更改infoPanel
的内容会很有帮助。
答案 1 :(得分:0)
正如已经建议的那样,在父组件上调用revalidate()
和repaint()
就足够了。它会自动将重新验证和重新绘制传播到该组件内的所有组件。