我使用類似於下面的觸摸界面的邏輯,所以我希望能夠使用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);
}
}
按照定義,mouseClicked事件只會發生在mousePresses和mouseReleased相同的地方。嘗試使用mouseReleased代替。您可能不應該在點擊事件中安裝傳輸處理程序,而應該將其作爲正常初始化過程的一部分來建立 – MadProgrammer
同意 - 但不會調用mouseReleased。我更新了代碼以匹配您的一些反饋。 – systemoutprintln
我怎麼不''TransferHandler' API:P – MadProgrammer