在循环中刷新 JLayeredPane()
Refreshing JLayeredPane() during a loop
我对使用 Java 编写 GUI 非常陌生。 Swing和AWT对我来说还是充满了谜团,我目前卡在其中之一。
我将尝试在不提供所有代码的情况下解释我的上下文:我正在使用 JFrame
,它的内容窗格中有一个 JLayeredPane
。第一层包含一些排列在网格中的按钮,并且工作正常。当我单击某个按钮时,我希望图像从第二层的底部向上滑动(我想使用 POPUP_LAYER
作为其合适的名称,但我想我可以使用任何第二层)。为了处理向上滑动的图像,我创建了一个扩展 JPanel
的自制 class。它对图像本身做了一些操作,然后有一个重写的 paintComponent
方法在这个面板中的特定 X、Y 位置绘制图像(占据所有屏幕)
动画应该是通过单击右键时调用的方法制作的。此方法基本上包含一个循环,该循环增加了在第二层的自定义 JLabel
(在我的代码中称为 popupPanel
)中绘制图像的 Y 分量。我在每一步都暂停线程,以使眼睛能够跟随动画。
问题是,动画根本不起作用。顶层没有按预期刷新。实际上,我只在所有循环结束后才看到我的图像弹出(它在几秒钟内什么都不做,然后只在最终位置显示它,这绝对不是重点)。从框架到 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();
}
}
}
感谢大家的建议!
Thread.sleep(int x)
确实是个糟糕的主意。最重要的是,我使用了一种名为 popupPanel.getY()
的方法来获取图像的 Y 位置。但这实际上覆盖了 JPanel
的内置方法,并产生了一些灾难性的结果。这太蠢了,我没注意到^^
解决这个问题并使用定时器为我的动画做了诀窍。谢谢大家!
如果 Sergiy Medvynskyy 或 MadProgrammer 想要将他的评论升级为答案以便我可以接受,欢迎他这样做。否则,我将只接受此答案以标记问题已解决。
谢谢!
我对使用 Java 编写 GUI 非常陌生。 Swing和AWT对我来说还是充满了谜团,我目前卡在其中之一。
我将尝试在不提供所有代码的情况下解释我的上下文:我正在使用 JFrame
,它的内容窗格中有一个 JLayeredPane
。第一层包含一些排列在网格中的按钮,并且工作正常。当我单击某个按钮时,我希望图像从第二层的底部向上滑动(我想使用 POPUP_LAYER
作为其合适的名称,但我想我可以使用任何第二层)。为了处理向上滑动的图像,我创建了一个扩展 JPanel
的自制 class。它对图像本身做了一些操作,然后有一个重写的 paintComponent
方法在这个面板中的特定 X、Y 位置绘制图像(占据所有屏幕)
动画应该是通过单击右键时调用的方法制作的。此方法基本上包含一个循环,该循环增加了在第二层的自定义 JLabel
(在我的代码中称为 popupPanel
)中绘制图像的 Y 分量。我在每一步都暂停线程,以使眼睛能够跟随动画。
问题是,动画根本不起作用。顶层没有按预期刷新。实际上,我只在所有循环结束后才看到我的图像弹出(它在几秒钟内什么都不做,然后只在最终位置显示它,这绝对不是重点)。从框架到 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();
}
}
}
感谢大家的建议!
Thread.sleep(int x)
确实是个糟糕的主意。最重要的是,我使用了一种名为 popupPanel.getY()
的方法来获取图像的 Y 位置。但这实际上覆盖了 JPanel
的内置方法,并产生了一些灾难性的结果。这太蠢了,我没注意到^^
解决这个问题并使用定时器为我的动画做了诀窍。谢谢大家!
如果 Sergiy Medvynskyy 或 MadProgrammer 想要将他的评论升级为答案以便我可以接受,欢迎他这样做。否则,我将只接受此答案以标记问题已解决。
谢谢!