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