在 Java 中移动标签

Moving the label in Java

我想制作一个标签并在屏幕上移动它。我试图找到一些视频和其他资源来了解如何操作,但我不能很好地理解它们,或者它们使用了我从未听说过的东西。 所以我编写了这段代码(框架扩展了 JFrame 并实现了 MouseListener):

这是主要的Class:

public class Main {

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

这是 class 代码:

public class Frame extends JFrame implements MouseListener{

    JLabel label;

    Frame() {
        label = new JLabel();

        label.setBounds(800, 200, 200, 200);
        label.setBackground(Color.RED);
        label.setOpaque(true);
        label.addMouseListener(this);

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(1200, 700);
        this.setLayout(null);
        this.add(label);
        this.setVisible(true);
        this.setLocationRelativeTo(null);
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        Point x = e.getPoint();
        label.setLocation(x);
        System.out.println(x);
    }

当我尝试移动标签时,标签移动了,但不在我想要的位置。 只是有时,标签会朝我想要的方向移动,但大多数时候,它会朝任何随机方向移动。即使我只是点击,它也会移动。 但是,即使标签向我想要的方向移动,它也会在该方向上随机长度。

您可以使用 MouseListener 来跟踪何时按下鼠标并获取标签的坐标,同时使用 MouseMotionAdapter 来跟踪何时移动(或拖动)鼠标帮助您设置标签的新位置。

更新: 要添加有关其工作原理的更多信息,e.getLocationOnScreen().x returns 基于计算机屏幕按下鼠标的 X 坐标,而 label.getX() returns 基于标签的 X 坐标在 Java Swing 容器上它已被添加到;在本例中,即 JFrame。因此,必须从前一个值中减去该值才能获得标签在屏幕上的实际 X 坐标。同样适用于 Y 坐标。获得两个坐标后,您可以使用 label.setLocation() 方法更改标签的位置,从而在屏幕上移动标签。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class LabelDragExample extends JFrame {
    JLabel label;
    int x, y;

    public LabelDragExample() {
        label = new JLabel();
        label.setBounds(800, 200, 200, 200);
        label.setBackground(Color.RED);
        label.setOpaque(true);
        label.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                x = e.getLocationOnScreen().x - label.getX();
                y = e.getLocationOnScreen().y - label.getY();
            }
        });
        label.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                label.setLocation(e.getLocationOnScreen().x - x, e.getLocationOnScreen().y - y);
                x = e.getLocationOnScreen().x - label.getX();
                y = e.getLocationOnScreen().y - label.getY();

            }
        });
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(1200, 700);
        this.setLayout(null);
        this.setVisible(true);
        this.add(label);
        this.setLocationRelativeTo(null);
    }

    public static void main(String[] args) {

        new LabelDragExample();

    }
}

我观察到鼠标在容器上的 (0, 0) 位置和标签的 (0, 0) 位置之间存在一些偏移。在附带的代码中,我将鼠标指针设置为标签在屏幕上的位置点,但您会注意到它没有与标签的 (0, 0) 位置完全对齐。我们需要调整这个偏移量。一旦我们调整偏移量,一切都会好起来的。您可以试试附上的代码:

package com.example.temp;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Main extends JFrame implements MouseListener {
    JLabel label;
    Point offset = new Point();

    Main() {
        addMouseListener(this);

        label = new JLabel();
        label.setBounds(0, 0, 200, 200);
        label.setBackground(Color.RED);
        label.setOpaque(true);

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(1200, 700);
        this.setLayout(null);
        this.add(label);
        this.setVisible(true);
        this.setLocationRelativeTo(null);
        try {
            Robot robot = new Robot();
            Point labelOSPoint = label.getLocationOnScreen();
            robot.mouseMove(labelOSPoint.x, labelOSPoint.y);
        } catch (AWTException ignored) {
        }
        Point labelPoint = label.getLocationOnScreen();
        Point containerPoint = this.getLocationOnScreen();
        offset.x = labelPoint.x - containerPoint.x;
        offset.y = labelPoint.y - containerPoint.y;
        System.out.println("offset x = " + offset.x + ", y = " + offset.y);
        label.setText("Location: x = " + label.getX() + ", y = " + label.getY());
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
        Point mousePoint = e.getPoint();
        System.out.println("mousePoint x = " + mousePoint.x + ", y = " + mousePoint.y);
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
        Point mousePoint = e.getPoint();
        label.setLocation(mousePoint.x - offset.x, mousePoint.y - offset.y);
        label.setText("Location: x = " + label.getX() + ", y = " + label.getY());
    }

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