2013-07-03 82 views
11

Làm cách nào để biết nút đã được nhấn từ trong sự kiện mouseDragged?mouseDragged không trả lại nút thích hợp xuống

Tôi đang gặp sự cố trong số mouseDragged() vì đã nhận được MouseEvent trả về 0 cho getButton(). Tôi không có vấn đề với vị trí chuột, hoặc thậm chí phát hiện các cú click chuột. Sự kiện mouseClicked() trả về nút thích hợp cho getButton().

Bất kỳ đề xuất nào về cách tôi có thể thực hiện việc này? Tôi cho rằng tôi có thể làm việc xung quanh bằng cách sử dụng mouseClicked hoặc mousePressed, nhưng tôi muốn giữ tất cả điều này trong phạm vi mouseDragged.

Cảm ơn bạn đã dành thời gian và câu trả lời.

+0

Bạn có thể kéo bằng nút chuột phải không, tôi chỉ được kéo bằng nút chuột trái – DevZer0

+1

Tôi đã thử nghiệm cả hai nút và nó được gửi 0 cho cả hai nút. –

Trả lời

16

Như đã chỉ ra trong ý kiến ​​và câu trả lời khác, SwingUtilities cung cấp ba phương pháp đối với trường hợp như thế này, mà nên làm việc cho tất cả MouseEvents:

SwingUtilities.isLeftMouseButton(aMouseEvent); 
SwingUtilities.isRightMouseButton(aMouseEvent); 
SwingUtilities.isMiddleMouseButton(aMouseEvent); 

Đối với những gì các vấn đề với cách tiếp cận của bạn là, javadoc của getButton() nói:

Trả về, nếu có, của các nút chuột đã thay đổi trạng thái.

Kể từ trạng thái của nút không thay đổi trong khi nó đang được tổ chức xuống, getButton() thường sẽ trở NO_BUTTON trong mouseDragged. Để kiểm tra trạng thái của các nút và công cụ sửa đổi như Ctrl, Alt, v.v. trong mouseDragged, bạn có thể sử dụng getModifiersEx(). Ví dụ, đoạn code dưới đây để kiểm tra rằng BUTTON1 suy giảm nhưng BUTTON2 không phải là:

int b1 = MouseEvent.BUTTON1_DOWN_MASK; 
int b2 = MouseEvent.BUTTON2_DOWN_MASK; 
if ((e.getModifiersEx() & (b1 | b2)) == b1) { 
    // ... 
} 
+0

Bạn nói đúng về phần đầu tiên (javadoc), nhưng tôi nghĩ rằng việc sử dụng 'SwingUtilities.isLeftMouseButton()' thậm chí còn tốt hơn (xem câu trả lời khác) – xav

+1

@xav Vì đây là câu trả lời được chấp nhận, tôi đã thêm phương pháp SwingUtilities để hiển thị tốt hơn (và mở rộng về lý do tại sao bạn có thể chọn 'getModifiersEx' thay thế). –

0

Đây có thể là sự cố với hộp cát java của bạn.

Mã sau hoạt động tốt mọi lúc (gần như bạn có thể thấy).

@Override 
public void mouseDragged(MouseEvent e) { 
    e.getButton(); 
} 

Vui lòng thử mã của bạn trên một máy khác.

2
int currentMouseButton = -1; 
@Override 
public void mousePressed(MouseEvent e) { 
    currentMouseButton = e.getButton(); 
} 

@Override 
public void mouseReleased(MouseEvent e) { 
    currentMouseButton = -1; 
} 

@Override 
public void mouseDragged(MouseEvent e) { 
    if (currentMouseButton == 3) { 
     System.out.println("right button"); 
    } 
} 
6

đúng Jacob rằng getButton() không giúp bạn có được nút bằng cách thiết kế. Tuy nhiên, tôi tìm thấy một giải pháp sạch hơn hoạt động bit trên getModifiersEx(), mà bạn cũng có thể sử dụng trong vòng mouseDragged:

if (SwingUtilities.isLeftMouseButton(theMouseEvent)) { 
    //do something 
} 

phương pháp tương tự tồn tại cho nút giữa và nút bên phải.

+0

Bạn nói đúng. Và tôi đoán điều này cũng tốt hơn cho tính di động hơn 'getModifiersEx()' (MacOS, Linux, ...) – xav

+0

@xav Về tính di động, [getModifiersEx()] (https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html#getModifiersEx()) là chính xác cùng (rất di động), bởi vì 'isLeftMouseButton (..)' & co. các phương thức được thực hiện dưới dạng nó. Xem [tại đây] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/swing/SwingUtilities.java#SwingUtilities.isLeftMouseButton%28java.awt.event .MouseEvent% 29). Đây là những phương thức tiện lợi dễ đọc hơn. –