在循环期间刷新JLayeredPane()

时间:2018-07-26 10:20:02

标签: java swing paintcomponent repaint jlayeredpane

对于使用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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

感谢大家的建议! Thread.sleep(int x)确实是一个可怕的想法。最重要的是,我正在使用一种名为popupPanel.getY()的方法来获取图像的Y位置。但这实际上覆盖了JPanel的内置方法,并给出了一些灾难性的结果。这真是愚蠢,我没注意到^^ 解决这个问题并使用计时器可以解决我的动画问题。谢谢大家!

如果Sergiy Medvynskyy或MadProgrammer希望将他的评论升级为答案,以便我可以接受,欢迎他这样做。否则,我将接受此答案以标记已解决的问题。

谢谢!