2013-07-03 17 views
11

mouseDragged olayından basılan düğmeyi nasıl bilebilirim?mouseDragged uygun tuşa geri dönme yok

Alınan MouseEvent, getButton() için 0 değerini döndürdüğü için mouseDragged() içinde bir sorun yaşıyorum. Fare konumuyla ilgili bir sorunum yok, hatta fare tıklamaları bile tespit ediyor. mouseClicked() olayı, getButton() için uygun düğmeyi döndürür.

Bunu nasıl yapabileceğime dair herhangi bir öneriniz var mı? mouseClicked veya mousePressed kullanarak bir çalışma yapabileceğimi varsayalım, ancak bunu mouseDragged içinde saklamayı tercih ederim.

Zaman ayırdığınız için teşekkür ederiz.

+0

sağ fare düğmesi ile sürükleyin Can, ben sadece ben her iki düğmeleri test farenin sol tuşu – DevZer0

+1

ile sürüklenen ve her iki düğmeleri için 0 gönderildi. Bu daha iyi görünürlük için SwingUtilities yaklaşımını eklendi kabul cevabı zaten olduğundan –

cevap

16

olarak SwingUtilities böyle durumlar için üç yöntem, tüm MouseEvents için çalışması gerektiğini sağlar, yorum ve diğer yanıtlar dikkat çekti: gelince

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

senin yaklaşımla sorunun ne olduğunu getButton() ait javadoc diyor:

Fare düğmelerinden hangisinin değiştiğini döndüren durum döndürülür.

aşağı tutulurken değişmez Düğme durumu, getButton() genellikle mouseDragged içinde NO_BUTTON dönecektir yana

. mouseDragged'da Ctrl, Alt vb. Gibi düğmelerin ve değiştiricilerin durumunu kontrol etmek için getModifiersEx()'u kullanabilirsiniz. Bir örnek olarak, aşağıdaki kod BUTTON1 aşağı ama BUTTON2 olmadığını kontrol eder: Size tasarım gereği düğmeye almaz

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

Haklısınız ilk bölümünü (javadoc) ilişkin ediyoruz ama SwingUtilities.isLeftMouseButton() 'da iyidir' kullanarak düşünüyorum – xav

+1

@xav (diğer yanıt bakın) (ve bunun yerine neden getModifiersEx'u seçebileceğinizi açıkladı). –

0

Bu, java korumanızın bir problemi olabilir.

Aşağıdaki kod de her zaman (neredeyse, gördüğünüz gibi) çalışır.

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

Lütfen kodunuzu farklı bir makinede deneyin.

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

Yakup'un sağ getButton() söyledi.

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

Benzer yöntemler orta düğmesi ve sağ düğme için var: Ancak, ben de mouseDragged içinde kullanabileceğiniz, getModifiersEx() üzerinde biraz operasyonları daha temiz bir çözüm buldum.

+0

Haklısınız. Ve sanırım bu da taşınabilirlik için getModifiersEx() 'den (MacOS, Linux, ...) daha iyi.) – xav

+0

@xav Taşınabilirlik açısından, [getModifiersEx()] (https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html#getModifiersEx()) tam olarak Aynı (çok taşınabilir), çünkü 'isLeftMouseButton (..)' & co. Yöntemler uygulanmaktadır. Bkz. [Burada] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/javax/swing/SwingUtilities.java#SwingUtilities.isLeftMouseButton%28java.awt.event .MouseEvent% 29). Bunlar daha kolay okunabilir kolaylık yöntemleridir. –

İlgili konular