我的 JComponent 的内容仅在手动调整大小后刷新
Posted
技术标签:
【中文标题】我的 JComponent 的内容仅在手动调整大小后刷新【英文标题】:The contents of my JComponent only refresh after a manual resize 【发布时间】:2011-04-05 22:21:30 【问题描述】:我试图弄清楚为什么我的 JComponent 在我手动拖动窗口时会刷新,但在我调用 repaint 或 revalidate 时它不会刷新。数据已准备好显示,但在我手动调整大小之前它不会显示。任何人都可以就我能做什么提供一些建议,或者这听起来不是 Swing 问题,因为我尝试了重新绘制和重新验证?
我注意到的一件奇怪的事情是,如果我有这个代码:
sp.setSize(sp.getSize().width, sp.getSize().height+1);
sp.setSize(sp.getSize().width, sp.getSize().height-1);
如果使用第一行,则 JComponent 将自行刷新。如果我不使用或同时使用这两条线,它就不会,这对我来说似乎很奇怪。
我基本上只是将 JPanel 放在 JDesktopPane 中的 JInternalFrame 中。我正在尝试做的事情有两个主要功能。一个添加新的 JPanel,另一个尝试刷新它,以便显示新数据:
public void addNewSP()
sp = new JInternalFrame("SP");
sp.setClosable(true);
sp.setLocation(700, 400); //this should be changed to something based on screen size
sp.setResizable(true);
sp.add(popUp);
this.parentContainer.add(sp, JLayeredPane.DRAG_LAYER);
sp.pack();
sp.show();
sp.setSize(500, 500);
sp.setPreferredSize(new Dimension(500, 500));
public void refreshSP()
sp.repaint();
sp.validate();
sp.repaint();
sp.validate();
parentContainer.validate();
parentContainer.repaint();
sp.setSize(sp.getSize().width, sp.getSize().height+1);
sp.setSize(sp.getSize().width, sp.getSize().height-1);
顺便说一句,parentContainer 是 JDesktopPane
【问题讨论】:
你没有提供足够的信息来做任何比疯狂猜测更好的事情。请发布 SSCCE (sscce.org)。 不幸的是,在这种情况下,我认为这不会有太大的好处。我很难隔离这个问题。我可能不得不检查我的代码并尝试更多的东西,这样我才能提出一个更好的问题。我只是希望我知道在 Swing 中手动调整大小是什么。我认为我正在使用 validate 和 repaint 进行正确的调用,但不是以正确的顺序或位置:( 好吧,知道我们知道您在谈论内部框架,建议会有所不同。这就是为什么您应该始终发布 SSCCE,这样我们就不会浪费时间猜测您在说什么。您是否阅读过 Swing 教程中关于“如何使用内部框架”的部分。该示例展示了如何动态创建内部框架并将其添加到桌面窗格 【参考方案1】:如果你正在修改容器的子组件,你应该调用 jcomponent.validate();
【讨论】:
我打电话给revaliadte,但它似乎并没有解决问题。我仍然不明白为什么手动调整 JPanel 的大小可以解决问题。 我将它们全部更改为验证,但没有更改。不过感谢您的建议。【参考方案2】:当改变容器的内容时,你必须同时调用:
revalidate()
使其重新计算其内容的布局
repaint()
请求重绘此容器
【讨论】:
这就是我所缺少的,非常感谢!对我来说,我在哪个容器上调用revalidate()
并不重要,它在我正在添加和移除的容器上以及在包含该容器的容器上工作。不过不需要打电话给repaint()
。【参考方案3】:
但在我手动调整大小之前它不会显示。
我们不知道您问题的背景,这就是为什么应始终按照之前的建议发布 SSCCE。
一般来说,JComponent 没有首选大小,所以我猜 Swing 认为它不需要绘制组件。当您调整框架大小时,组件可能会添加到 BorderLayout 的中心,因此它会自动调整大小以填充框架的整个空间。
解决方案是给组件一个“首选大小”,以便任何布局管理器都可以使用此信息正确显示组件。
【讨论】:
Preferred Size 不幸的是没有改变任何东西【参考方案4】:我假设 parentContainer
是 JDesktopPane?
您对sp
进行了哪些未显示的更改?
更改sp
的大小将导致Swing 从头开始重新绘制。这就是setSize()
修复显示器的原因。
您所做的更改很可能不是在 EDT 上发生,或者没有使正确的容器失效。例如,如果您更改sp
中组件的可见性,则需要调用sp.invalidate()
重新运行布局管理器。
您是否检查过您只是在 EDT 上更改组件(或其模型)?
对此的快速测试是使用Substance LAF 运行,因为如果您在另一个线程上更改内容,它会报错。
【讨论】:
以上是关于我的 JComponent 的内容仅在手动调整大小后刷新的主要内容,如果未能解决你的问题,请参考以下文章
DataGridViewComboBoxColumn 自动调整大小不正确或仅在选择时正确