Java 在循环期间刷新JLayeredPane()
我对用Java编程GUI非常陌生。Swing和AWT对我来说仍然充满神秘感,我现在被困在其中一个上面 我将尝试在不给出所有代码的情况下解释我的上下文:我使用的是Java 在循环期间刷新JLayeredPane(),java,swing,paintcomponent,repaint,jlayeredpane,Java,Swing,Paintcomponent,Repaint,Jlayeredpane,我对用Java编程GUI非常陌生。Swing和AWT对我来说仍然充满神秘感,我现在被困在其中一个上面 我将尝试在不给出所有代码的情况下解释我的上下文:我使用的是JFrame,它的内容窗格中有一个JLayeredPane。第一层包含一些按网格排列的按钮,工作正常。当我点击某个按钮时,我希望在第二层上有一个从底部向上滑动的图像(我想用POPUP\u layer作为它的合适名称,但我想我可以使用任何第二层)。为了控制图像向上滑动,我创建了一个扩展JPanel的自制类。它对图像本身执行一些操作,然后使用
JFrame
,它的内容窗格中有一个JLayeredPane
。第一层包含一些按网格排列的按钮,工作正常。当我点击某个按钮时,我希望在第二层上有一个从底部向上滑动的图像(我想用POPUP\u layer
作为它的合适名称,但我想我可以使用任何第二层)。为了控制图像向上滑动,我创建了一个扩展JPanel
的自制类。它对图像本身执行一些操作,然后使用重写的paintComponent
方法在该面板中的特定X,Y位置绘制图像(这将占用所有屏幕)
动画应该是通过单击右键时调用的方法制作的。此方法基本上包含一个循环,该循环增加第二层的自定义JLabel
(在我的代码中称为popupanel
)中绘制图像的Y分量。我在每一步都暂停线程,使眼睛能够跟随动画
问题是,动画根本不起作用。顶层在应该刷新时不会刷新。实际上,我看到我的图像只有在所有循环结束后才会弹出(它在几秒钟内什么都不做,然后在最终位置显示,这绝对不是重点)。我尝试在每一步的每一件事情上使用repaint()和revalidate(),从帧到popupanel
。不起作用
我不知道要调用哪个方法来刷新此。。。实际上,一旦循环完成,我认为应该有可能在循环的中间进行更新……p>
但是怎么做呢
我将提供带有循环的动画方法的代码。如有必要,我可以上传其余代码:
public void animpopUp() {
//getting the initial Y position of the image in the custom panel :
int y = popUpPanel.getY();
int ymiddle=y+popUpPanel.getImageSize().height/2;
//starting a loop to make the image go up gradually
while(ymiddle>tailleFenetre.height/2) {
//decreasing Y (going up)
y--;
ymiddle=y+popUpPanel.getImageSize().height/2;
//setting the Y of the popUpPanel, that will be used in the paintComponent to place the image
popUpPanel.setY(y);
//revalidating and repainting every fucking thing, just to make sure
this.revalidate();
overlayPanel.revalidate();
popUpPanel.revalidate();
overlayPanel.repaint();
popUpPanel.repaint();
this.repaint();
//pausing the loop in order to have a visible animation
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
谢谢大家的建议!
Thread.sleep(intx)
确实是个糟糕的主意。除此之外,我还使用了一个名为popupanel.getY()
的方法来获取图像的Y位置。但这实际上覆盖了JPanel
的内置方法,并导致了一些灾难性的结果。这太傻了,我没注意到^^
解决了这个问题,并使用计时器为我的动画做了诀窍。谢谢大家
如果Sergiy Medvynsky或MadProgrammer想将他的评论升级为答案,以便我可以接受,欢迎他这么做。否则,我就接受这个答案来标记问题的解决
谢谢 不要使用
Thread.sleep
,因为这会完全停止UI更新。改用javax.swing.Timer
。有关更多信息,请阅读。我很久没有接触Swing了,但是如果您的框架中有网格或网格包布局,移动对象将不起作用。我建议在开始用精简版绘图之前使用IDE Pallete(Eclipse或Apache NetBeans)air@MayhemJLayeredPane
没有defaultWell分配给它的布局管理器,并且