繁体   English   中英

动态更改嵌套的 Swing 组件

[英]Dynamically change nested Swing component

这是我的问题:我有一个JPanel ,其中包含一个JTabbedPane ,它有一个使用自定义JPanelJScrollPane 很简单,我将自定义 JPanel 更改为我的程序的一种方式,并且我需要所有父组件来反映更改。 但是,我不知道我需要使用什么来完成此操作。 这就是我现在所拥有的:

    infoScroller.remove(infoPanel);
    this.reevaluateInfoPanel();
    infoScroller.setViewportView(infoPanel);
    infoScroller.revalidate();
    infoScroller.repaint();

其中infoScollerJScrollPaneinfoPanel是自定义的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 相反,当我revalidaterepaint它( JTabbedPane )时,它只是将它完全删除。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM