Java JLabel移动到坐标

Java JLabel移动到坐标,java,swing,awt,jlabel,Java,Swing,Awt,Jlabel,使JLabel自动移动到坐标位置的最佳方法是什么?对于此类任务是否有预定义的方法 示例:代替label.setLocation(x+1,y+1);(重新运行以移动) 比如: 示例:label.moveTo(500500);还是找到最佳路径/路线的方法 我已经阅读了有关Oracle的java文档,但找不到类似的文档。这是一个基本的示例,说明如何在一段时间内将JLabel从一个位置移动到另一个位置 这是基于时间的动画,这意味着动画的速度取决于希望动画播放的时间。物体需要移动的距离也会影响速度 imp

使JLabel自动移动到坐标位置的最佳方法是什么?对于此类任务是否有预定义的方法

示例:代替label.setLocation(x+1,y+1);(重新运行以移动) 比如: 示例:label.moveTo(500500);还是找到最佳路径/路线的方法


我已经阅读了有关Oracle的java文档,但找不到类似的文档。

这是一个基本的示例,说明如何在一段时间内将
JLabel
从一个位置移动到另一个位置

这是基于时间的动画,这意味着动画的速度取决于希望动画播放的时间。物体需要移动的距离也会影响速度

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class MoveLabel {

    public static void main(String[] args) {
        new MoveLabel();
    }

    public MoveLabel() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public static class TestPane extends JPanel {

        protected static final int PLAY_TIME = 4000;

        private JLabel label;
        private int targetX;
        private int targetY;
        private long startTime;
        private final int startX;
        private final int startY;

        public TestPane() {
            setLayout(null);
            label = new JLabel("Testing");
            label.setSize(label.getPreferredSize());
            add(label);

            Dimension size = getPreferredSize();

            startX = 0;
            startY = 0;

            targetX = (size.width - label.getSize().width) / 2;
            targetY = (size.height - label.getSize().height) / 2;

            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    int x = label.getX();
                    int y = label.getY();
                    long duration = System.currentTimeMillis() - startTime;
                    float progress = (float)duration / (float)PLAY_TIME;
                    if (progress > 1f) {
                        progress = 1f;
                        ((Timer)(e.getSource())).stop();
                    }

                    x = startX + (int)Math.round((targetX - startX) * progress);
                    y = startY + (int)Math.round((targetY - startY) * progress);

                    label.setLocation(x, y);
                }
            });
            startTime = System.currentTimeMillis();
            timer.start();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
    }
}

您需要手动计算从一个点到另一个点的路径,并在每一步调用setLocation()。另外,像这样的动画应该用一个摆动计时器来完成,这样你就能看到标签每一步都在移动。哦,天哪。类似十亿条if语句检查x位置是否<或>到其他x位置?我有一个摆动计时器,我只是没有显示我的代码。三个字:Bresenham的行algorithm@Nic不是真的。根据你想要达到的目标,直线运动其实很简单。如果你想要更复杂的东西,你可以看看谢谢。我将介绍算法和引擎。至少我知道这比我预想的要复杂:)正是我要找的,我会看一下。