移动组件

时间:2016-01-31 00:25:21

标签: java swing components repaint

一开始我想强调,我是Java的新手,我总是试着自己找到问题的答案,但有时我会到达死胡同,这就是为什么我想问你是否有这个想法。

我尝试制作纸牌游戏。我想做一个非常简单的事情(在我看来),就是将JLabel与一张卡片的图像从一个点移动到一个JPanel内部的另一个点,这是一个移动的延迟40ms创建一个"动画"处理卡。

然而,当我尝试这样做时,我得到了卡的重复,尽管我刷新了父JPanel。到目前为止,我一直在寻找答案如何做到这一点,对我来说没有任何作用。我试图用卡本身刷新JLabel,它的父JPanel也没有任何影响。

唯一的部分解决方案是重新绘制JPanel,这是使用JLabel的JPanel的父级,但它导致整个GUI的闪烁,这是不可接受的。只有这样,我在这里附上的图片中没有像这样的重复。

注意:我使用绝对布局,但是我知道它是多么不专业的事实。这只是因为我不知道如何使用其他经理来遵守我的其他布局。

我非常感谢您提供给我的任何提示或解决方案。

图像展示了我想要实现的目标

http://i.stack.imgur.com/7JvRz.jpg

图像展示当前情况

http://i.stack.imgur.com/mSa4r.jpg

public void moveCard() 
{
// move the card to x = 0 (its destination) inside the parent panel 
while (movedCard.getX() != 0)
    {
    // try to reach x = 0
    // as the starting x cannot be divided through 20 it must subtract 21 once at the end
    if (movedCard.getX() == 21)
        {
        movedCard.setLocation(movedCard.getX() - 21, movedCard.getY());
        }
        else
        {
        movedCard.setLocation(movedCard.getX() - 20, movedCard.getY());
        }
        // repaint the panel that the card is drawn on
        movedCard.getParent().paintComponents(movedCard.getParent().getGraphics());

        // wait until the card is moved for the next time  
        try
            {
                Thread.sleep(40);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        // set the location of the card to default
        movedCard.setLocation(341, movedCard.getY());
    }
}

0 个答案:

没有答案