Java 在循环期间刷新JLayeredPane()

Java 在循环期间刷新JLayeredPane(),java,swing,paintcomponent,repaint,jlayeredpane,Java,Swing,Paintcomponent,Repaint,Jlayeredpane,我对用Java编程GUI非常陌生。Swing和AWT对我来说仍然充满神秘感,我现在被困在其中一个上面 我将尝试在不给出所有代码的情况下解释我的上下文:我使用的是JFrame,它的内容窗格中有一个JLayeredPane。第一层包含一些按网格排列的按钮,工作正常。当我点击某个按钮时,我希望在第二层上有一个从底部向上滑动的图像(我想用POPUP\u layer作为它的合适名称,但我想我可以使用任何第二层)。为了控制图像向上滑动,我创建了一个扩展JPanel的自制类。它对图像本身执行一些操作,然后使用

我对用Java编程GUI非常陌生。Swing和AWT对我来说仍然充满神秘感,我现在被困在其中一个上面

我将尝试在不给出所有代码的情况下解释我的上下文:我使用的是
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@Mayhem
JLayeredPane
没有defaultWell分配给它的布局管理器,并且