【发布时间】: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 教程中关于“如何使用内部框架”的部分。该示例展示了如何动态创建内部框架并将其添加到桌面窗格
标签: java swing resize refresh jcomponent