2012-10-20 35 views
5

मैं स्विंग का उपयोग करके जावा में एक प्रोग्राम बना रहा हूं, जिसमें एक GUI है जिसमें तीर कुंजियां हैं। तीर कुंजी कुंजीपटल पर तीर कुंजियों से मेल खाती है।जावा स्विंग: संबंधित कीबोर्ड बटन का उपयोग करते समय दबाए गए बटन दिखाएं

जब मैं कीबोर्ड पर ऊपर तीर कुंजी दबाता हूं, तो मुझे दबाए जाने के रूप में दिखाने के लिए जीयूआई पर ऊपर तीर कुंजी चाहिए। जब तक मैं तीर कुंजी जारी नहीं करता, यह दिखाना चाहिए कि इसे अभी भी दबाया जा रहा है, और जब इसे रिलीज़ किया जाता है तो इसे भी जारी किया जाना चाहिए।

मेरे कोड का एक टुकड़ा अब तक (केवल ऊपर बटन के लिए) है, जो मुझे लगता है कि इस शो में पूरी तरह से गलत है दबाया जा रहा श्रेणी:

... 
if (e.getKeyCode() == KeyEvent.VK_UP) { 
        actionArrowUp(); 
        JButton buttonUp = (JButton) mainTab.getComponent(4); 
        buttonUp.setSelected(true); 
       } 
... 
@Override 
public void keyReleased(KeyEvent e) { 
      if (e.getKeyCode() == KeyEvent.VK_UP) 
       actionArrowUpRelease(); 
       buttonUp.setSelected(true); 
+1

हां, मेरी माफ़ी। अक्सर जब मुझे एक उपयोगी उत्तर मिलता है, तो मैं इसका उपयोग करने के लिए बहुत जल्दबाजी और तूफान हूं। मैं उसके लिए माफी माँगता हूँ। – Sven

+2

1) शायद इसके लिए [कुंजी बाइंडिंग] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) पर विचार करें। 2) जल्द से जल्द बेहतर सहायता के लिए, एक [एसएससीसीई] (http://sscce.org/) पोस्ट करें। 3) उस अन्य मामले में भाग लेने पर अच्छी कॉल। :) प्रतिनिधिमंडल के लिए –

उत्तर

4

कुंजी बाइंडिंग का उपयोग करना (जैसा कि पहले से उल्लेख किया गया @trashgod है) जाने का तरीका है। ठीक उसी दृश्य व्यवहार प्राप्त करने के लिए के रूप में यदि अंतरिक्ष से बटन को सक्रिय/प्रवेश (जब यह केंद्रित थे)

  • कार्रवाई है कि बटन के डिफ़ॉल्ट दबाया के लिए पंजीकृत कार्यों/
  • जरूरतों दोनों दबाया के लिए बाध्य जारी किया गया के लिए प्रतिनिधि को लागू और अनुकरण
  • प्रकार के अपने inputMap में बटन के माता-पिता के लिए बाध्य स्थापित कुंजी जारी की WHEN_ANCESTOR

कोड में:

// the delegating action 
public static class SimulateButtonAction extends AbstractAction { 

    AbstractButton button; 

    public SimulateButtonAction(AbstractButton model, String fire) { 
     super(fire); 
     this.button = model; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Action delegate = button.getActionMap().get(getName()); 
     delegate.actionPerformed(new ActionEvent(button, 
       ActionEvent.ACTION_PERFORMED, getName())); 
    } 

    public String getName() { 
     return (String) getValue(Action.NAME); 
    } 

} 

// example usage 
JComponent content = new JPanel(new GridLayout(0, 5)); 
Action log = new AbstractAction() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("triggered: " + ((AbstractButton) e.getSource()).getText()); 
    } 

}; 
String pressed = "pressed"; 
String released = "released"; 
ActionMap actionMap = content.getActionMap(); 
InputMap inputMap = content.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 
String[] arrows = {"UP", "DOWN", "LEFT", "RIGHT"}; 
for (int i = 0; i < arrows.length; i++) { 
    JButton button = new JButton(log); 
    button.setAction(log); 
    button.setText(arrows[i]); 
    content.add(button); 
    // simulate pressed 
    String pressedKey = pressed + arrows[i]; 
    inputMap.put(KeyStroke.getKeyStroke(arrows[i]), pressedKey); 
    actionMap.put(pressedKey, new SimulateButtonAction(button, pressed)); 
    String releasedKey = released + arrows[i]; 
    inputMap.put(KeyStroke.getKeyStroke(released + " " +arrows[i]), releasedKey); 
    actionMap.put(releasedKey, new SimulateButtonAction(button, released)); 
} 
+0

+1, जो सीधे बटन के मॉडल में हेरफेर करने से बचाता है। – trashgod

4

यह LinePanelKey Bindings उपयोग करता है और actionPerformed() में doClick() invokes प्राप्त करने के लिए आपके द्वारा वर्णित एक प्रभाव के समान प्रभाव।

परिशिष्ट: आप बटन दबाया जबकि कुंजी दबाने दिखाना चाहते हैं के रूप में, आप KeyStroke.getKeyStroke() की वैकल्पिक onKeyReleased पैरामीटर का उपयोग करने में सक्षम हो सकता है। जैसा कि ButtonModel में वर्णित है, आपको बटन को माउस में नीचे अनुकरण करने के लिए सशस्त्र और दबाए गए मॉडल को बनाने की आवश्यकता होगी।