Sadece herhangi bir bileşenin fare dinleyicileri ekleyerek ve java.awt.Component
setLocation
işlevini kullanarak sürüklemeyi denedim. Düşünce tarzımın mümkün olup olmadığını test etmek için JButton
ile başladım. java bileşenleri fareyle hareket ettirme
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);
}
}
nasılsa bu düzgün çalışması için başarısız olur ve neden alamadım: Burada
Yapmak ne çalışıyorum için bir kod örneğidir. Gerçek mesafe sürüklenen fare hareketinin yarısıdır ve iki fare pozisyonu
MouseMotionListener
üzerinden yarışıyormuş gibi sürüklenirken bu mesafe etrafında titriyor.
Herkes bir salıncak/awt noob yardımcı olabilir mi? =) Şimdiden çok teşekkürler.
Düzenleme: (!)
Tamam, sorun ben olay pozisyon göreli olmanın ateş JComponent
için her fare yerde refire olacağını bilmiyordum olmasıydı.
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);
}
}
Teşekkür Adel linki için çabaları ve mKorbel için: Yani bu düzeltilmiş ve çalışma kodudur.
Ayrıca bkz yapacağını daha iyidir [ 'ChessBoard'] (http://stackoverflow.com/a/2562685/230513). – trashgod
Evet, cam bölme kesinlikle buraya gitmenin yolu, ancak örneği olabildiğince basit tutmaya çalıştım ama yine de karşılaştırılabilir. Umarım bu gelecek okurları karıştırmaz. GLASSPANE KULLANIN! (Ya da [katmanlı bölme] (http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html) DRAG_LAYER ile – Stephan