我尝试通过简单地添加鼠标侦听器并使用setLocation
java.awt.Component
函数来使任何组件可拖动。我从JButton
开始测试是否有可能按照我的想法进行测试。
以下是我正在尝试做的代码示例:
import java.awt.*;
import javax.swing.*;
public class DragButton extends JButton{
private volatile int draggedAtX, draggedAtY;
public DragButton(String text){
super(text);
setDoubleBuffered(false);
setMargin(new Insets(0, 0, 0, 0));
setSize(25, 25);
setPreferredSize(new Dimension(25, 25));
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
draggedAtX = e.getX() - getLocation().x;
draggedAtY = e.getY() - getLocation().y;
}
});
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
setLocation(e.getX() - draggedAtX, e.getY() - draggedAtY);
}
});
}
public static void main(String[] args){
JFrame frame = new JFrame("DragButton");
frame.setLayout(null);
frame.getContentPane().add(new DragButton("1"));
frame.getContentPane().add(new DragButton("2"));
frame.getContentPane().add(new DragButton("3"));
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
不知何故,这无法正常工作,我不明白为什么。拖动的实际距离是鼠标移动距离的一半,并且在拖动时它会在该距离周围闪烁,就像两个鼠标位置在MouseMotionListener
上竞争一样。
愿任何人帮助挥杆/击球杆吗? =) 非常感谢提前。
编辑:
好的,问题是我不知道事件会在每个鼠标位置重新启动,其位置相对(!)到触发JComponent
。所以这是经过纠正和运作的代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DragButton extends JButton{
private volatile int draggedAtX, draggedAtY;
public DragButton(String text){
super(text);
setDoubleBuffered(false);
setMargin(new Insets(0, 0, 0, 0));
setSize(25, 25);
setPreferredSize(new Dimension(25, 25));
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
draggedAtX = e.getX();
draggedAtY = e.getY();
}
});
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
setLocation(e.getX() - draggedAtX + getLocation().x,
e.getY() - draggedAtY + getLocation().y);
}
});
}
public static void main(String[] args){
JFrame frame = new JFrame("DragButton");
frame.setLayout(null);
frame.getContentPane().add(new DragButton("1"));
frame.getContentPane().add(new DragButton("2"));
frame.getContentPane().add(new DragButton("3"));
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
感谢Adel的努力和mKorbel的链接。
答案 0 :(得分:13)
你必须与JComponent
一起移动,我在空洞mousePressed/mouseDragged
中错过了这个定义;另一方面,ComponentMover的@[camickr][1]
优秀代码没有什么比这更好了。
答案 1 :(得分:5)
import javax.swing.*;
import java.awt.event.*;
public class movingButton extends JFrame{
private JButton button ;
public movingButton ()
{
super("Position helper");
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setSize(500,520);
super.setVisible(true);
super.setLayout(null);
button = new JButton ("drag me ");
add(button);
button.setBounds(100, 100, 150, 40);
button.addMouseMotionListener(new MouseAdapter(){
public void mouseDragged(MouseEvent E)
{
int X=E.getX()+button.getX();
int Y=E.getY()+button.getY;
button.setBounds(X,Y,150,40);
}
});
}
public static void main (String x[])
{
new movingButton();
}
}
答案 2 :(得分:2)
为什么不使用java Transferable界面?
以下是如何操作的教程: http://www.javaworld.com/javaworld/jw-03-1999/jw-03-dragndrop.html
答案 3 :(得分:0)
如果你做的话会更好
int X=E.getX() + button.getX();
int Y=E.getY() + button.getY();