2010-08-25 25 views
5

Belirli bir işlem sırasında belirli bir tuşa (örneğin CTRL) basıldığını algılayabilmem gerekir. Anahtar dinleyiciye veya fare olayına erişimim yok. Umduğum şey, "boolean isKeyPressed (keycode)" gibi bir yönteme sahip bir sınıf olacak.Java - Bir dinleyici kullanılmadan bir tuşa basılıp basılmadığını tespit edebilir miyiz?

Java'da böyle bir yöntemin farkında olan var mı?

Biraz arka plan için, bir bileşenin varsayılan sürükleme & bırakma davranışını geçersiz kılmaya çalışıyorum. Varsayılan olarak, DropTargetDragEvent için javadocs'a göre, hiçbir anahtar değiştiriciye basılmazsa, o zaman bir hareket için bileşenin desteklenen eylemler listesinde görünür, daha sonra bir kopya bir kopyasını ve ilkini bulduktan sonra durur.

Uygulamamda hem kopyayı hem de & numaralı bağlantıyı destekliyoruz. Javadoc'a göre, CTRL tuşuna basılmadan, varsayılan eylem kopyadır. Kullanıcının varsayılan eylemi belirleyebilmesini (en yaygın olarak kullanılmasını sağlamak için izin vermelerini) ve sonra değiştirici tuşlarını kullanarak belirli bir tanesini zorlayabilmesini istiyoruz.

Tuşa basılmış durumu algılayabilirsem, bunun olmasını zorlayabilirim ancak varsayılan eylemi değiştirmenin başka bir yolunu göremiyorum. peşin

sayesinde Brian

+5

Neden bir dinleyiciye erişiminiz yok? Kendini yaratamaz mısın? Hangi GUI çerçevesini kullanıyorsunuz? –

+0

Noel - Erick Robertson'un yazısına karşı yorumum görünüyor. – DaddyB

cevap

0

böyle bir yöntem olsaydı bile, onunla yapmak istiyorsun? Bir noktada doğru geri dönüşü ümidiyle sonsuz bir döngü içinde çağırın. Olay tabanlı/dinleyici tabanlı bir mekanizmanın bu davada daha iyi olduğunu düşünüyorum.

+1

sonsuz bir döngü değil, no. Belirli bir işlem sırasında talep üzerine çağrılır (sürükle ve bırak sırasında geri arama). – DaddyB

5

MouseEvent.getModifiers() yöntemi, MouseEvent üretildiği anda basılan bir değiştirici anahtar bitmap'i döndürecektir. Veya, özellikle CTRL anahtarını kontrol etmek için MouseEvent.isControlDown()'u kullanabilirsiniz.

+0

İdeal bir dünyada, önemli bir dinleyicinin muhtemelen en iyisi olacağını kabul ediyorum. Ancak, bence, senaryo için bu yaklaşımla ilgili bazı problemler var: Dinleyiciyi neye bağlarım? Benim uygulama UI açısından oldukça karmaşık ve eklentileri ile de özelleştirilebilir. Olay dinleyicisine bir Dinleyiciyi eklemeye baktım, ancak bu, tüm önemli olayları işleyişini sonuçlandırıyor ve başka yerlerde performans sonuçları olabilir. Benzer şekilde, uygulamanın genişletilebilirliği, sürüklemenin başlangıcını algılamanın bir yolunun olması gerekmediği anlamına gelir ve bu nedenle dinleyiciyi – DaddyB

+0

numaralı telefona seçerek dinleyemiyorum. Bir fare düğmesi basılı tutulduğunda önemli olayların tetiklenmediği ortaya çıkıyor (ve benimle sürükleyip bırakıyorum) ve böylece bir anahtar dinleyiciyi kural dışı bırakıyor. Sanırım küresel bir fare dinleyicisine bakıp değiştiricilerin durumunu kontrol edebilirim ama bu sorun için çok fazla bir şey gibi görünmüyor. – DaddyB

+0

Yanıtımı güncelledim - fare hareket ettirildiğinde veya sürüklendiğinde MouseEvent'in oluşturulup oluşturulmadığını kontrol edebilirsiniz. –

0

Sanırım yanlış yöne gidiyorsunuz. Ne yapmak istediğiniz, bırakıldığında değil, sürükleme başlatıldığında eylemi değiştirmek. Kullanıcının tercihlerini "değiştirici" olmayan durumda sorgulamak da dahil olmak üzere, işlemin başlatılmasında ne gibi değişiklikler yapılabileceği vardır. DropTargetDragEvent yönteminin çağrılmasının değiştirilmesi mümkündür.

+0

Katılıyorum - ancak kodda "değiştirici yok" durumunun nasıl ayarlanabileceğini çalışmaz - javadocs (orijinal gönderimdeki bağlantıya bakın) kopyanın bağlantıya göre öncelikli olduğunu gösterir. Bunu nasıl yapacağınız konusunda herhangi bir öneriniz varsa o zaman çok takdir edilecektir. – DaddyB

1

Bunun için muhtemelen kirli bir yoldur. Ancak bu, önemli olayları kaydetmenize ve daha sonra bunları sorgulamanıza olanak tanır.

//register this somewhere in the startup of your application 
KeyboardFocusManager mgr = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
    mgr.addKeyEventDispatcher(KeyEventRecorder.getInstance()); 

//then can query events later 
    KeyEvent keyEvt = KeyEventRecorder.getLastEvent(); 
    if(keyEvt != null && keyEvt.getKeyCode() == KeyEvent.VK_CONTROL && keyEvt.getID() == KeyEvent.KEY_PRESSED) 
     //do something.. 

    private class KeyEventRecorder implements KeyEventDispatcher 
    { 
     private static KeyEvent lastEvent; 
     private static KeyEventRecorder myInstance; 

     private KeyEventRecorder() 
     { 
      super(); 
     } 

     public static synchronized KeyEventRecorder getInstance() 
     { 
      if(myInstance == null) 
       myInstance = new KeyEventRecorder(); 
      return myInstance; 
     } 

     /** 
     * retrieve the last KeyEvent dispatched to this KeyEventDispatcher 
     */ 
     public static KeyEvent getLastEvent() 
     { 
      return lastEvent; 
     }//method 

     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) 
     { 
      lastEvent = e; 
      //return false to let KeyboardFocusManager redistribute the event elsewhere 
      return false; 
     }//method 
    }//class