在 Jframe 中移动对象

Moving objects in Jframe

我有一些我想要移动的 JButton,例如在这段代码中:

package javaapplication19;
import java.awt.*;
import java.awt.Container;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;


public class JavaApplication19 extends JFrame{
    public static JButton button=new JButton("Button");//Button to move
    public static int x;
    public static int y;
    public JavaApplication19(){
        final Container C = getContentPane();
        C.setLayout(null);
        button.setBounds(100,100,100,100);
        C.add(button);
        //MouseListenerStart
    button.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    if(!e.isMetaDown()){
    x = e.getX();
    y = e.getY();
    }
    }
    });
    button.addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent e) {
    if(!e.isMetaDown()){
    Point p = getLocation();
    button.setLocation(p.x + e.getX() - x,
    p.y + e.getY() - y);
    }
    }
    });
//MouseListenerend
    }
    public static void main(String[] args) {
        JavaApplication19 marco=new JavaApplication19 ();
        marco.setSize(1000,700);
        marco.setVisible(true);
        marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
    }}

但是有两个问题。第一个是 JButton 的移动速度比鼠标慢。第二个是 JButton 在拖动时似乎在 JFrame 的两个位置之间跳转。

我该如何解决这些问题?

已解决。

在此代码中:

package javaapplication19;
import java.awt.*;
import java.awt.Container;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;


public class JavaApplication19 extends JFrame{
    public static JButton button=new JButton("Button");//Button to move
    public static int x;
    public static int y;
    public JavaApplication19(){
        final Container C = getContentPane();
        C.setLayout(null);
        button.setBounds(100,100,100,100);
        C.add(button);
        //MouseListenerStart
    button.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent e) {
    if(!e.isMetaDown()){
    x = e.getX();
    y = e.getY();
    }
    }
    });
    button.addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseDragged(MouseEvent e) {
    if(!e.isMetaDown()){
    Point p = button.getLocation();\I Simply had to put button.getLocation() instead of getLocation()
    button.setLocation(p.x + e.getX() - x,
    p.y + e.getY() - y);
    }
    }
    });
//MouseListenerend
    }
    public static void main(String[] args) {
        JavaApplication19 marco=new JavaApplication19 ();
        marco.setSize(1000,700);
        marco.setVisible(true);
        marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
    }
}

您应该尝试编写可用于任何组件的更通用的代码。您在解决方案中发布的代码是硬编码的,因此它只适用于名为 "button".

的变量

有关允许您拖动任何组件的更通用的解决方案,请查看 Moving Windows 中的 Basic Dragging 部分。