マウスリスナーを追加し、のsetLocation
関数を使用するだけで、任意のコンポーネントをドラッグ可能にしようとしました。私はJButton
から始めて、私が考えた方法で可能かどうかをテストしました。ここでマウスでJava移動コンポーネント
は私がやろうとしています何のためのコードの例です:
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);
}
}
はどういうわけか、これは正常に動作しないと私は、なぜ得ることはありません。ドラッグされた実際の距離は、マウスの移動の距離の半分であり、2つのマウスの位置がMouseMotionListener
を超えて競合しているかのようにドラッグしながら、その距離の周りでちらつきます。
誰かがスイング/ awtのノブを助けてもらえますか? =) 事前に感謝します。
編集:(!)
オクラホマので、問題は、私は、イベントが位置が相対である焼成JComponent
にして、各マウスの位置でrefireということを知らなかったということでした。これは修正されたコードです:
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);
}
}
あなたの努力のおかげでアデルとリンクのためのmKorbel。
参照[ 'ChessBoard'](http://stackoverflow.com/a/2562685/230513)を行うならばそれは良いです。 – trashgod
もちろん、ここに行くのは確かにガラス板ですが、できるだけシンプルにしていますが、コンパイルは可能です。私はこれが将来の読者を混乱させないことを願っています。 GLASSPANEを使用してください! (またはDRAG_LAYERを使用した[layered pane](http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html) – Stephan