2012-01-27 14 views
12

マウスリスナーを追加し、の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。

+0

参照[ 'ChessBoard'](http://stackoverflow.com/a/2562685/230513)を行うならばそれは良いです。 – trashgod

+1

もちろん、ここに行くのは確かにガラス板ですが、できるだけシンプルにしていますが、コンパイルは可能です。私はこれが将来の読者を混乱させないことを願っています。 GLASSPANEを使用してください! (またはDRAG_LAYERを使用した[layered pane](http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html) – Stephan

答えて

11

あなたはJComponentに移動する必要が、私はmousePressed/mouseDragged空隙にこの定義を欠場。他の手では、ComponentMoverのための優秀なコードとして@[camickr][1]のように良いものはありません。

+0

ああ私の神、ありがとうございました!最初のいくつかの兆候は、私の頭に打たれました。 ^^ 正しいコードを表示するために投稿を編集しました。 – Stephan

+0

@Stephan:あなたが有用であると答えた回答を無視しないでください。 – trashgod

+0

まあ、最近はできませんでした。 ;) – Stephan

2

代わりにJava Transferableインターフェイスを使用しないでください。ここで

はそれを行う方法についてのチュートリアルです: http://www.javaworld.com/javaworld/jw-03-1999/jw-03-dragndrop.html

+0

java.awt.dndはコンポーネントのアニメーションをサポートしていますか?私は、アニメーション自体ではなく、ドラッグ・アンド・ドロップのデータを削除する必要はありません(それは必要ですが、それは軽微な問題です)。私が見つけたほとんどのチュートリアルでは、カーソルだけがドラッグアンドドロップを示すデータ転送部分についてのみ説明しました。私はコンポーネント全体を動かしたい。 (私の英語のためにうんざりします^^) – Stephan

+0

@Stephan Transferableは_java.awt.datatransfer_パッケージから来ますので、_awt_ –

+0

Sryでドラッグアンドドロップをサポートできますが、これは私の質問には答えませんが、ドラッグの実際の例が見つかりましたjava.awt.dndとjava.awt.datatransferを使用してアニメーション(!)をドロップします:[link](http://weblogs.java.net/blog/gfx/archive/2005/10/drag_and_drop_e.html)。 彼はソースコードのみをリンクしていたので、これを使って作業するのは楽しいことではありません。 – 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

ドラッグしたときにマウスポインタが実際のコンポーネントからオフセットされていますか?何か案は? – unekwu

0

あなたも

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

私はあなたの答えが適切だとは思わない - まず、あなたはそのスニペットの使用に関するコメントを提供せず、第2に異なるレターサイズを使用している。 –

関連する問題