Java 移动JLabel';每个更新的位置

Java 移动JLabel';每个更新的位置,java,swing,user-interface,jlabel,repaint,Java,Swing,User Interface,Jlabel,Repaint,我正在学习Swing,我有以下代码: public class SimView { private JFrame frame; private JLabel background; private JPanel car_panel; public SimView() { frame = new JFrame("GUI"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400,

我正在学习Swing,我有以下代码:

public class SimView {

private JFrame frame;
private JLabel background;
private JPanel car_panel;

public SimView() {

    frame = new JFrame("GUI");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 500);
    frame.getContentPane().setLayout(null);

    background = new JLabel("");
    background.setIcon(new ImageIcon(
            "C:\\Users\\D__\\Desktop\\background.png"));
    background.setBounds(0, 0, 384, 462);
    frame.getContentPane().add(background);
    frame.setVisible(true);

    car_panel = new JPanel();
    car_panel.setBounds(175, 430, 16, 21);
    car_panel.setVisible(true);
    car_panel.setBackground(Color.BLACK);
    background.add(car_panel);

    MoveCarRunnable carMover = new MoveCarRunnable(car_panel);

}

private static class MoveCarRunnable implements Runnable {

    private JPanel car;

    MoveCarRunnable(final JPanel car) {

        this.car = car;

    }

    @Override
    public void run() {
        // Should I call rePaint() on the car_panel here then ? 

    }

}
我想做的是在每次更新时移动称为“car”的JLabel的y坐标,以获得其自身移动的效果,即没有用户交互。我不太确定如何做到这一点,我想我需要某种repaint()方法为每次更新重新绘制JLabel的位置。但是我如何让这个类知道它需要更新位置呢

如有任何提示(链接/代码),将不胜感激。我想了解Swing及其组件在这种情况下是如何工作的,而不仅仅是采用一种解决方案,但当然我对一种解决方案感兴趣,这样我可以更深入地研究它。谢谢

编辑:
请参见上面的“我的编辑代码”

您最好在布局中添加一个
JPanel
,而不是标签。选择
JPanel
的尺寸,以便在每个阶段都能容纳您的汽车


然后覆盖该面板的
paint
方法以将图像定位在其上。

您必须创建一个单独的
线程来修改标签的位置,然后在容器上调用
validate()
repaint()
frame.getContentPane()
)。不要忘了在线程中放入一些
sleep()


但是,有更好的方法来创建一个单独的
JPanel
。在它里面,您可以覆盖
paintComponent
方法或
paint
方法,在那里您可以绘制图像,而不是移动
JLabel
s。

1。使用javax.swing.Timer调整更新速度2。使用setLocation()移动组件3。使用label.setSize(label.getPreferredSize())调整标签大小。4.使用空布局不是学习Swing的一个很好的选择,而是使用LayoutManager的5。如果你想看一部动画,请看一看@mKorbel pure coincincidence,我猜,或者另一张海报的灵感来自我的例子。。。不可能知道。;-)JPanel是为汽车,还是也为背景?@Jatt没有区别。您必须使用
JPanel
作为汽车自身的喷漆区域。使用自己的绘制方法。@Jatt这两种方法都是正确的,通过取消绘制组件或使用JLabel移动,都无所谓,取决于您的决定。您能否提供一个简短的示例来说明您的意思?我已经创建了另一个线程,但不知道如何重新绘制?这对我不起作用。请查看我对迄今为止添加的内容的编辑。将其添加到run()方法中:label.setLocation(x,y);frame.getContentPane().validate();frame.getContentPane().repaint();哎呀。永远不要忘记这一点。但是现在就这么做了。我现在正在尝试您的建议:)@Jatt确保您将代码包装在
SwingUtilities.invokeXXX
块中的Threads
run()
方法中,因为更新
JLabel
仅从
Thread
定位它不符合Swing最佳实践。或者,看一看将在EDT上运行的a。@Dan我会向OP提到一些关于EDT的内容,因为你给了他使用线程移动Swing组件的建议,这样就可以使其脱离EDT,除非我误解了你的解决方案+1尽管对于
JPanel
解决方案通常比移动
JLabel
要好(尤其是用于游戏目的)