2012-01-27 20 views
12

Sadece herhangi bir bileşenin fare dinleyicileri ekleyerek ve java.awt.ComponentsetLocation 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.

+0

Ayrıca bkz yapacağını daha iyidir [ 'ChessBoard'] (http://stackoverflow.com/a/2562685/230513). – trashgod

+1

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

cevap

11

Sen JComponent ile hareket etmek zorunda;: Burada

bunu yapmak için nasıl bir öğretici var diğer ellerde, ComponentMover için @[camickr][1] mükemmel kod olarak daha iyi bir şey yoktur.

+0

Aman Tanrım, bu bağlantı için çok teşekkürler! İlk birkaç sebep beni kafama vurdu. ^^ Doğru kodu göstermek için gönderimi düzenledim. – Stephan

+0

@Stephan: Yararlı bulduğunuz yanıtları oylamayı ihmal etmeyin. – trashgod

+0

Eh, son zamanlarda yapamam. ;) ComponentMover için – Stephan

2

Neden java Transferable arabirimini kullanmıyorsunuz? Ben boşluklara mousePressed/mouseDragged bu tanımlara özledim, http://www.javaworld.com/javaworld/jw-03-1999/jw-03-dragndrop.html

+0

java.awt.dnd bileşenlerin hareketli animasyonunu destekliyor mu? Sürükle ve Bırak veri bırakma kısmına ihtiyacım yok (buna ihtiyacım var ama bu küçük bir problem). Bulduğum en öğreticiler, sadece imlecin sürükleyip bırakmayı gösterdiği veri aktarım bölümünü açıkladı. Tüm bileşenin hareket etmesini istiyorum. (ingilizce için kızarım ^^) – Stephan

+0

@Stephan Aktarılabilir, _java.awt.datatransfer_ paketinden geliyor. Bu nedenle, _awt_ –

+0

Sry'de sürükle ve bırak özelliğini destekleyebilir, ancak bu, soruyu yanıtlamıyor, ancak sürükle çalışan bir çalışma örneği buldum ve java.awt.dnd ve java.awt.datatransfer kullanarak animasyonu (!) bırakın: [link] (http://weblogs.java.net/blog/gfx/archive/2005/10/drag_and_drop_e.html). Bunun üzerinden çalışmak, sadece kaynak kodunu bağladığı için eğlenceli değil. – Stephan

4
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(); 
    } 
} 
+0

Çalışmaları ve ne yapmam gerektiği için yeterli olabilir, ancak fare işaretçisi sürüklerken gerçek bileşenle dengeleniyor mu? Herhangi bir fikir? – unekwu

0

Eğer

int X=E.getX() + button.getX(); 
int Y=E.getY() + button.getY(); 
+0

Cevabınızın doğru olduğunu düşünmüyorum - öncelikle, söz konusu snippet'i kullanmaya ilişkin herhangi bir yorum yapmıyorsunuz ve ikincisi farklı harf boyutu kullanıyorsunuz. –

İlgili konular