[英]java move components with mouse
我試圖通過簡單地添加鼠標偵聽器和使用java.awt.Component
的setLocation
函數來使任何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的鏈接。
你必須使用JComponent
移動,我在空洞中錯過了這個定義mousePressed/mouseDragged
; 在另一方面,沒有什么比@[camickr][1]
的ComponentMover優秀代碼更好了。
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();
}
}
為什么不使用java Transferable接口呢?
這是一個如何做的教程: http : //www.javaworld.com/javaworld/jw-03-1999/jw-03-dragndrop.html
如果你願意的話會更好
int X=E.getX() + button.getX();
int Y=E.getY() + button.getY();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.