2013-06-21 121 views
1

我使用類似於下面的觸摸界面的邏輯,所以我希望能夠使用mousePressed啓動拖動,但同時能夠使用mouseClicked或mouseReleased如果用戶沒有拖動。Java拖放和鼠標監聽器

在mousePressed上,我開始拖動。上的mouseClicked,我希望它打印出「的mouseClicked」,並就「的mouseReleased」打印的mouseReleased,但由於某些原因,

dropLabel.getTransferHandler().exportAsDrag(dropLabel, e, 
      TransferHandler.COPY); 

燕子引起的mouseClicked事件和時的mouseReleased我也不事件不會甚至被解僱移動鼠標。請注意,註釋掉該行會導致所有偵聽器被觸發(但顯然拖動未啓動)。

如何以我想要的方式獲得所有鼠標事件,特別是mouseClicked/mouseReleased,當用戶不做任何拖動時,如果用戶確實拖動,仍然能夠導出AsDragged?任何黑客/裂縫/反射解決方案都是受歡迎的。

這裏是我與工作的一些示例代碼說明了我的實際問題:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.TransferHandler; 

public class DragTest extends JFrame implements MouseMotionListener, 
     MouseListener { 

    private JPanel leftPanel = new JPanel(null); 
    private JPanel rightPanel = new JPanel(null); 
    JLabel dropLabel; 

    public DragTest() { 
     this.setLayout(new GridLayout(1, 2)); 

     leftPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     rightPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     this.add(leftPanel); 
     this.add(rightPanel); 
     leftPanel.addMouseListener(this); 
     leftPanel.addMouseMotionListener(this); 

     JTextArea area = new JTextArea(); 

     rightPanel.setLayout(new GridLayout(1, 1)); 
     rightPanel.add(area); 

     dropLabel = new JLabel("drop"); 
     dropLabel.setTransferHandler(new TransferHandler("text")); 

    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     System.out.println("mousePressed"); 


     Dimension labelSize = dropLabel.getPreferredSize(); 
     dropLabel.setSize(labelSize); 
     int x = e.getX() - labelSize.width/2; 
     int y = e.getY() - labelSize.height/2; 
     dropLabel.setLocation(x, y); 
     leftPanel.add(dropLabel); 


     dropLabel.getTransferHandler().exportAsDrag(dropLabel, e, 
       TransferHandler.COPY); 

     repaint(); 

    } 

    @Override 
    public void mouseDragged(MouseEvent me) { 
     System.out.println("mouseDragged"); 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     System.out.println("mouseClicked"); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 

     System.out.println("mouseReleased"); 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 

    public static void main(String[] args) { 

     DragTest frame = new DragTest(); 
     frame.setVisible(true); 
     frame.setSize(600, 400); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
+0

按照定義,mouseClicked事件只會發生在mousePresses和mouseReleased相同的地方。嘗試使用mouseReleased代替。您可能不應該在點擊事件中安裝傳輸處理程序,而應該將其作爲正常初始化過程的一部分來建立 – MadProgrammer

+0

同意 - 但不會調用mouseReleased。我更新了代碼以匹配您的一些反饋。 – systemoutprintln

+0

我怎麼不''TransferHandler' API:P – MadProgrammer

回答

5

你真的需要到的mouseReleased火還是什麼?我認爲這應該很好地工作:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseMotionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.TransferHandler; 

public class DragTest extends JFrame implements MouseMotionListener, 
     MouseListener { 

    private JPanel leftPanel = new JPanel(null); 
    private JPanel rightPanel = new JPanel(null); 
    JLabel dropLabel; 

    public DragTest() { 
     this.setLayout(new GridLayout(1, 2)); 

     leftPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     rightPanel.setBorder(BorderFactory.createLineBorder(Color.black)); 
     this.add(leftPanel); 
     this.add(rightPanel); 
     leftPanel.addMouseListener(this); 
     leftPanel.addMouseMotionListener(this); 

     JTextArea area = new JTextArea(); 

     rightPanel.setLayout(new GridLayout(1, 1)); 
     rightPanel.add(area); 

     dropLabel = new JLabel("drop"); 
     dropLabel.setTransferHandler(new TransferHandler("text")); 

    } 
    @Override 
    public void mousePressed(MouseEvent e) { 
     System.out.println("mousePressed"); 
     Dimension labelSize = dropLabel.getPreferredSize(); 
     dropLabel.setSize(labelSize); 
     int x = e.getX() - labelSize.width/2; 
     int y = e.getY() - labelSize.height/2; 
     dropLabel.setLocation(x, y); 
     leftPanel.add(dropLabel); 



     repaint(); 

    } 

    @Override 
    public void mouseDragged(MouseEvent me) { 
     System.out.println("mouseDragged"); 
      dropLabel.getTransferHandler().exportAsDrag(dropLabel, me, 
        TransferHandler.COPY); 
    } 

    @Override 
    public void mouseMoved(MouseEvent e) { 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     System.out.println("mouseClicked"); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     System.out.println("mouseReleased"); 

    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 

    } 

    @Override 
    public void mouseExited(MouseEvent e) { 

    } 

    public static void main(String[] args) { 

     DragTest frame = new DragTest(); 
     frame.setVisible(true); 
     frame.setSize(600, 400); 
     frame.setResizable(false); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

我剛搬到調用開始拖動事件進入的mouseDragged通話,這樣一來,如果你只需點擊鼠標那麼一切正常通話。但是,如果您拖動鼠標,它將觸發拖放呼叫,該呼叫仍會阻止其他呼叫,但只有在您拖動時纔會再次阻止其他呼叫。如果你只是點擊,它一切正常。