在循环中刷新 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 想要将他的评论升级为答案以便我可以接受,欢迎他这样做。否则,我将只接受此答案以标记问题已解决。

谢谢!