【问题标题】:How to keep a swing component updated如何保持摆动组件更新
【发布时间】:2011-12-27 15:55:06
【问题描述】:

我的一个类返回一个 JPanel,它是由其他类添加到 JFrame 上的。 JPanel 包含一个 JTree 和一些按钮。在某些事件中,面板会再次创建并返回到 JFrame。

我的问题是我必须再次将 JPanel 添加到 JFrame 的容器中,然后调整框架的大小以使更改可见。我不知道如何在不调整大小的情况下更新框架。我尝试删除旧对象并添加更新的对象,但仍然不起作用。

处理此问题的最佳方法是什么?理想情况下,我会引用 JPanel,当 JPanel 更改时,框架也会更新。

【问题讨论】:

  • 容器好像没有那个方法。你的意思不是 invalidate() 对吗?
  • JTree 变化的内容听起来你的树模型实现是无效的,因为它没有通知它的听众关于变化/s
  • @maple_shaft revalidate 仅在添加/删除组件后才需要,而不是在模型更改或更改组件属性时需要
  • 似乎正在发生变化,但在不同的层或其他东西上(如果我调整窗口大小我可以看到它们)即使没有重新绘制。所以问题是如何删除旧窗格
  • 你所看到的清​​楚地表明了我的猜测:你的 model 没有通知它的听众。解决这个问题,一切都会好起来的:-)

标签: java swing jpanel jtree


【解决方案1】:

整个模型不仅在改变它的数据。将来我可能会更改此设置,但现在当数据更改时会创建一个新的 JTree

那么你的代码应该是这样的:

JTree tree = new JTree( theNewModel );
scrollPane.setViewportView( tree );

也就是说你需要将新的JTree添加到GUI中,你不能只改变对tree变量的引用。

或者更简单,您不需要创建新的 JTree,只需使用以下命令替换现有树中的模型:

tree.setModel( theNewModel );

如果这仍然没有帮助,那么您需要发布您的 SSCCE 来证明问题,因为您的问题仍然不清楚。

【讨论】:

  • scrollPane.getViewport().getView();
  • 我输掉赌注的一天(和我自己)——这次是关于 scrollPane.getViewportView 的存在 :-) 再次对不对称核心 api 感到惊讶......
  • @kleopatra,这是我第一次输入的内容,但后来我重新检查了 API,发现它也丢失了 ;-)
【解决方案2】:

先尝试JFrame.invalidate(),然后拨打JFrame.validate()

http://docs.oracle.com/javase/6/docs/api/java/awt/Container.html#invalidate%28%29

【讨论】:

  • -1,Swing 使用 MVC 设计。正如在 cmets 中已经提到的,模型有责任通知视图数据已更改,以便视图可以重新绘制自己。您不会仅仅因为您对框架上的一个组件的模型进行了更改而重新绘制或 revalidate() 整个框架。有一个设计问题需要解决。
  • 整个模型不仅在改变它的数据。将来我可能会更改此设置,但现在当数据更改时会创建一个新的 JTree。
猜你喜欢
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
相关资源
最近更新 更多