2016-04-02 12 views
2

olması gerekir. Tuşa basma/serbest bırakma özelliği için InputMap ve ActionMap'u kullanmaya karar verdim.tuş sadece ben (<code>JComponent</code> miras) özel bir bileşen vardır ve bir bağlantı altını çizmek istiyorum CTRL_DOWN_MASK ve CTRL_MASK (win10 için)

Ben inme bulmak için bu kodu kullanın:

stroke = KeyStroke.getKeyStroke("pressed CONTROL"); 

Ama her nasılsa yanlıştır. Ben JComponent ait processKeyBinding yöntemini ayıklanan ve ben CTRL bir KeyStroke sahip Değiştirici basarsanız 130.

enter image description here

(bu benim InputMap olduğunu öğrenmek arg0 Klavyeden incomming tuş olduğunu)

ben 130 kodu 128 vardır ve CTRL_MASK kodu 2 sahiptir CTRL_DOWN_MASK eklenmesi sonucu olduğunu düşünüyorum.

  1. Bu değiştiricileri neden eklemek zorundayım?
  2. Bu çapraz platform mu?
  3. Herhangi bir resmi dokümantasyon var mı?

için tam bir örnek camickr istekleri:

public class Test extends JLabel { 
    public static void main(String[] args) { 
     final JFrame jf = new JFrame("Test"); 
     final Test label = new Test(); 
     jf.getContentPane().add(label); 
     jf.setBounds(200, 200, 500, 500); 
     jf.pack(); 
     jf.setVisible(true); 
     label.grabFocus(); 
    } 

    public Test() { 
     super("Foobar"); 
     addBoldOnCtrl(); 
    } 

    public void addBoldOnCtrl() { 
     final KeyStroke onDown = KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, KeyEvent.CTRL_MASK + KeyEvent.CTRL_DOWN_MASK); 
     final String onDownName = "react on ctrl"; 
     getInputMap().put(onDown, onDownName); 
     getActionMap().put(onDownName, new AbstractAction() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       final Font f = getFont(); 
       setFont(new Font(f.getFontName(), f.getStyle(), f.getSize() + 2)); 
       repaint(); 
      } 
     }); 
    } 
} 
+0

[JavaDocs] 'da belirtildiği gibi (https://docs.oracle.com/javase/7/docs/api/java/awt/event/InputEvent.html#CTRL_MASK) - * "Kontrol tuşu değiştirici sabiti. CTRL_DOWN_MASK yerine bunun yerine kullanılması önerilir. "* - Muhakeme, API'nin bir kısmının değiştirilmiş olması, muhtemelen bir hatanın üstesinden gelmesi ve" CTRL_MASK_DOWN "işlevini kullanmayı tercih etmeye geçmesidir. Genellikle – MadProgrammer

+0

Vurgulamak istediğiniz anlamına mı geliyor? Kontrol tuşu kapalıyken fareyi kullanarak bir bağlantı? Bunun için 'MouseEvent ' – MadProgrammer

+0

@MadProgammer 1'in özelliklerini inceleyebilirsiniz. InputMap bu şekilde çalışmaz, InputMap' AWTKeyStroke' nin eşitlik-yöntemini kullanır. 2. Hayır, fareyi hareket ettirdiğimi farzedelim ve bir mousemove olmadan CTRL tuşuna bastığımda klavyedeki tuşa basmak fare hareketi değildir ve 'MouseEvent 'tetiklenmez. –

cevap

1

1.Why i Postadölesan değiştiricileri eklemek gerekiyor?

Sadece CTRL_DOWN_MASK olmak üzere iki değiştirici eklemeniz gerekmez.

Yani tuş oluşturmak için kullanabilirsiniz:

KeyStroke ks = KeyStroke.getKeyStroke("control CONTROL"); 

KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_CONTROL, KeyEvent.CTRL_DOWN_MASK); 

açıkça bunu yapmak gerek ama "değiştirici tuşları" klavyede diğer tuşlar farklıdır bildiren herhangi belgelerin bilmiyorum .

+0

Hayır olabilir, onlar "130" değiştirici olmadan çalışamazlar! InputMap.get() 'ile adlandırılan' AWTKeyStroke # equals'. –

+1

Sihirli numaralarla çalışmıyorum. 130 benim için hiçbir şey ifade etmiyor. Yukarıdaki KeyStrokes benim için çalışıyor. Bu, CTRL tuşuna bastığımda ActionMap'a eklediğim Eylem çağrılır. Sizin için çalışmazsa sorunu gösteren [SSCCE] 'yi (http://sscce.org/) gönderin. – camickr

+0

"VK_CONTROL" işlevini "CTRL_DOWN_MASK" ile birleştirmeyi düşünmemiştim, güzel – MadProgrammer

İlgili konular