java - 每次更新时移动 JLabel 的位置

标签 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, 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 及其组件在这种情况下如何工作的概念,而不仅仅是采用解决方案,但我当然对解决方案感兴趣,以便我可以更仔细地研究它。谢谢

编辑: 请参阅上面我的编辑代码

最佳答案

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

但是,有更好的方法来创建单独的 JPanel。在其中,您将重写 paintComponent 方法或 paint 方法,然后您将绘制图像,而不是移动 JLabel

关于java - 每次更新时移动 JLabel 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13494210/

相关文章:

java - 警告 : The method start() from the type Thread is deprecated

java - 泛型中的有界类型无法扩展另一个有界类型

java - 通过 Spring 将 Google guava 缓存构建器注入(inject) bean

java - 跟踪 Swing 组件的正确方法是什么?

c++ - 在 GUI 应用程序(C++ 或 C#)中处理复杂规则

java - 如何访问联系人

java - JFrame 不呈现任何组件

java - java应用程序swing中的按钮共享图像

java - 如何分发 java GUI 构建器项目

Java 图形用户界面 : Getting started?