【问题标题】:Java Update JPanel components WITHOUT removingJava 更新 JPanel 组件而不删除
【发布时间】:2014-03-01 14:52:51
【问题描述】:

我有一个复杂的 JPanel,它有各种嵌套的 JPanel 作为组件。

我想将其中一个嵌套面板替换为新面板。但我无法让顶级面板重新绘制新组件,除非我将它们全部删除并重新添加:

JPanel topLevel = new JPanel();
JPanel upperPane = new JPanel();
JPanel lowerPane = new JPanel();

JPanel infoPane = new JPanel();

upperPanel.add(infoPane);
topLevel.add(UpperPane);
topLevel.add(lowerPane);

// 上面的(伪代码)显示得很好。 //现在我想:

infoPane = new JPanel(); //Changed this Panel somehow;

topLevel.revalidate();
topLevel.repaint();

//以上2行不显示新信息。

我怎样才能让它更新?

【问题讨论】:

  • “我怎样才能让它更新?” 使用CardLayout 而不是尝试替换。见this example
  • @peeskillet 这并不能满足我的需要,因为所有“卡片”都需要在开始时创建。显示第一张后,您无法更改基础卡。
  • 考虑发布MCTRE

标签: java jpanel


【解决方案1】:

如果您调用new JPanel(),那么您引用的是内存中的不同点。因此,upperPanel 上对旧 JPanel 的引用将丢失,此后对 infoPane 所做的更改将不会显示。

我自己没有尝试过,但是更改 infoPane 而不调用 new,这很可能是您的答案。

【讨论】:

  • 不幸的是我不能,因为我使用的库迫使我做一个新的来获取图表。
  • 然后简单地重复upperPanel.add(infoPane);。当您调用new 时,您不再指的是显示的JPanel,因此在您添加之前所做的任何更改都是不可见的。
  • 但是。我需要先从 upperPanel 中删除它。问题是我有时会在删除和再次添加之间出现屏幕故障 - 即使它们是连续的行
【解决方案2】:

FWIW,你描述的设计范式对我来说似乎很尴尬。继续使用原始 infoPane 实例并简单地重绘其内容不是更直接吗?那么您的顶级面板不必参与更改。

所以,当您调用 new() 时,让您的 infoPane 显示您的库为您提供的任何内容,并且只需使用 new() 将 new WhatItIs() 放入您的 infoPane。

这在你的环境中有用吗?

希望这会有所帮助。

【讨论】:

  • 这正是我想要的——但不幸的是,如果在嵌套中较低的任何地方使用“new”,更高级别的面板将无法识别更改。
猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 2012-02-04
  • 1970-01-01
  • 2012-02-28
  • 2012-09-10
  • 1970-01-01
  • 2014-10-05
相关资源
最近更新 更多