对于使用Java编程GUI来说我是一个新手。对于我来说,Swing和AWT仍然充满着奥秘,而我目前仍受困于其中之一。
我将尝试在不提供所有代码的情况下解释我的上下文:我正在使用JFrame
,其内容窗格中带有JLayeredPane
。第一层包含一些按网格排列的按钮,并且工作正常。当我单击某个按钮时,我希望图像从第二层的底部向上滑动(我曾想过使用POPUP_LAYER
作为其合适的名称,但我想可以使用任何第二层)。为了解决图像滑移的问题,我创建了一个扩展JPanel
的自制类。它对图像本身进行了一些操作,然后有一个覆盖的paintComponent
方法可以在此面板(占据所有屏幕)的特定X,Y位置绘制图像。
应该通过单击鼠标右键时调用的方法来制作动画。此方法基本上包含一个循环,该循环会增加Y分量,在第二层的自定义JLabel
(在我的代码中称为popupPanel
)中绘制图像。我在每一步都暂停了线程,以使眼睛可以跟随动画。
事实是,动画根本不起作用。顶层不应该刷新。实际上,我仅在所有循环结束后才看到我的图像弹出(几秒钟不执行任何操作,然后将其显示在最终位置,这绝对不是重点)。我尝试在从框架到popUpPanel
的每一步中对每一个东西使用repaint()和revalidate()。不起作用。
我不知道该调用哪种方法来刷新它...由于循环完成后它实际上可以工作,我想应该有可能在循环中间对其进行更新...
但是如何?
我将通过循环提供动画方法的代码。如有必要,我可以上传其余代码:
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();
}
}
}
答案 0 :(得分:0)
感谢大家的建议!
Thread.sleep(int x)
确实是一个可怕的想法。最重要的是,我正在使用一种名为popupPanel.getY()
的方法来获取图像的Y位置。但这实际上覆盖了JPanel
的内置方法,并给出了一些灾难性的结果。这真是愚蠢,我没注意到^^
解决这个问题并使用计时器可以解决我的动画问题。谢谢大家!
如果Sergiy Medvynskyy或MadProgrammer希望将他的评论升级为答案,以便我可以接受,欢迎他这样做。否则,我将接受此答案以标记已解决的问题。
谢谢!