2011-02-24 7 views
47

मैं प्रोग्रामिंग रूप से एक स्विंग जेबटन पर कैसे क्लिक करूंगा जो सभी प्रासंगिक क्रिया/माउस घटनाओं को पंजीकृत करेगा और उपयोगकर्ता को दिखाई देगा (यानी वे बटन को दबाएंगे जैसे कि वे वास्तव में इसे क्लिक किया)?जावा स्विंग में प्रोग्रामिंग रूप से एक जीयूआई बटन पर क्लिक करना

बटन उसी एप्लिकेशन में है जो मैं चला रहा हूं; मैं किसी अन्य एप्लिकेशन में एक बटन को नियंत्रित करने की कोशिश नहीं कर रहा हूं। मुझे लगता है कि मैं सीधे कतार में घटनाओं को इंजेक्ट कर सकता हूं, लेकिन यदि संभव हो तो मैं उस दृष्टिकोण से बचना पसंद करूंगा, और ऐसा करने से यह एक दृश्य क्लिक नहीं दिखाएगा।

मुझे लगता है कि java.awt.Robot क्लास माउस को स्थानांतरित करने और माउस पर क्लिक करने के तरीकों की पेशकश करता है, लेकिन इसे किसी विशेष बटन पर क्लिक करने के लिए नहीं।

+0

के संभावित डुप्लिकेट (http: // stackoverflow। कॉम/प्रश्न/4753004/कैसे करें-i-programatically-send-actionevent-to-jbutton) – OscarRyz

उत्तर

87

आप doClick() का उपयोग कर की कोशिश की?

+1

ऐसा लगता है जैसे क्लिक करें() काम करेगा! मुझे पहले यह ध्यान रखना चाहिए था। मुझे लगता है कि मैंने इसे याद किया क्योंकि यह सीधे जेबटन में परिभाषित नहीं है, इसे सार बटन से विरासत में मिला है। – Gigatron

+4

@ गीगाट्रॉन - हाँ। एब्स्ट्रक्शन कभी-कभी यह जानना मुश्किल हो सकता है कि आपके लिए क्या उपलब्ध है (विशेष रूप से यदि कोई अच्छा दस्तावेज नहीं है - जावाडॉक्स के लिए ईमानदारी का शुक्र है)। मैं खुशी से मदद कर सकता है! – JasCav

+7

हो सकता है कि क्लिक करें() 'या' प्रेस() 'बेहतर नाम –

2

आप इसे हमेशा स्रोत के रूप में एक एक्शन इवेंट फायर करके अनुकरण कर सकते हैं।

http://download.oracle.com/javase/6/docs/api/java/awt/event/ActionEvent.html

सक्रिय करने के लिए यह कार्रवाई घटना ऊपर बनाते हैं, और जो कुछ भी श्रोता तुम सिर्फ फोन करना चाहते हैं

ActionEvent e = new ActionEvent(myButton,1234,"CommandToPeform"); 
myListener.actionPerformed(e); 
9

तो doClick() नहीं तुम क्या चाहते है, तो आप बटन को वास्तव में माउस ले जाते हैं और यह भी दबा सकते हैं:

public void click(AbstractButton button, int millis) throws AWTException 
{ 
    Point p = button.getLocationOnScreen(); 
    Robot r = new Robot(); 
    r.mouseMove(p.x + button.getWidth()/2, p.y + button.getHeight()/2); 
    r.mousePress(InputEvent.BUTTON1_MASK); 
    try { Thread.sleep(millis); } catch (Exception e) {} 
    r.mouseRelease(InputEvent.BUTTON1_MASK); 
} 
+0

जैसे कुछ ऐसा दृष्टिकोण है जिसे मैं पहले सोच रहा था, लेकिन मुझे लगा कि एक आसान समाधान होना चाहिए .. और वास्तव में doClick() का सरल समाधान है। – Gigatron

+0

इस तरह आप निश्चित हैं, कीलॉगर्स या इससे भी बेहतर: मोलोगर्स ने इस घटना को भी पकड़ लिया होगा: डी –

+1

रोबोट क्लास की देरी() विधि पहले से ही रोकथाम है। –

2

हालांकि प्रश्नकर्ता button.doClick() से संतुष्ट , मैं कुछ ऐसा ढूंढ रहा था जैसे एक स्नेही सेट करने के बाद क्या होता है, यानि button.setMnemonic(KeyEvent.VK_A) के साथ। आप वास्तव में कुछ भी होने के बिना ALT + A दबा सकते हैं (दृश्य परिवर्तन को छोड़कर)। और कुंजी ए (एएलटी के साथ या बिना) के रिलीज होने पर, बटन एक्शनवेन्ट को निकाल देता है।

मैंने पाया कि मैं, button.getModel() साथ (Java 8 API देखें) ButtonModel प्राप्त कर सकते हैं तो नेत्रहीन (दोनों स्मृति सहायकों द्वारा बदल रहे हैं) model.setPressed(true); model.setArmed(true); साथ बटन दबाते हैं, और नेत्रहीन false करने के लिए दोनों की स्थापना करके बटन छोड़ें। और जब model.setPressed(false) कॉल किया जाता है, जबकि बटन दबाया जाता है और सशस्त्र होता है, तो बटन स्वचालित रूप से एक्शनवेन्ट को सक्रिय करता है (model.setArmed(false) कॉलिंग केवल दृश्यमान रूप से बटन बदलता है)।

एक बटन शुरू हो रहा है, और एक ActionEvent निकाल दिया जाता है, जब माउस, जबकि मॉडल सशस्त्र है जारी किया गया है [...] [ButtonModel जावा API दस्तावेज़ों से उद्धरण]

बनाने के बटन दृश्यमान होने पर कुंजी प्रेस पर प्रतिक्रिया करता है (जिसमें खिड़की के बिना या फोकस मालिक होने की आवश्यकता वाले बटन के बिना, यानी जब विंडो में एक और घटक केंद्रित होता है) मैंने कुंजी बाइंडिंग का उपयोग किया (Official Java Tutorial देखें)।

कार्य कोड: बटन को दृश्यमान रूप से दबाए रखने के लिए SHIFT + A दबाएं (button.setMnemonic() के साथ निमोनिक सेट होने के बाद कुंजी के साथ ALT दबाए जाने के विपरीत)। और कंसोल पर एक्शन कमांड ("बटन") मुद्रित करने के लिए कुंजी जारी करें।

// MnemonicCode.java 
import javax.swing.*; 
import java.awt.event.*; 

public class MnemonicCode extends JFrame 
{ 
    public MnemonicCode(int keyCode) 
    { 
    JButton button = new JButton("button"); 

    getContentPane().add(button); 
    addMnemonicToButton(button,keyCode); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) 
     { 
     System.out.println(e.getActionCommand()); 
     } 
    }); 

    pack(); 
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    setVisible(true); 
    } 

    public static void main(String[] args) throws Exception 
    { 
    MnemonicCode bp = new MnemonicCode(KeyEvent.VK_A); 
    } 

    void addMnemonicToButton(JButton button,int keyCode) 
    { 
    int shiftMask = InputEvent.SHIFT_DOWN_MASK; 

    // signature: getKeyStroke(int keyCode, int modifiers, boolean onKeyRelease) 
    KeyStroke keyPress = KeyStroke.getKeyStroke(keyCode,shiftMask,false); 
    KeyStroke keyReleaseWithShift = KeyStroke.getKeyStroke(keyCode,shiftMask,true); 

    // get maps for key bindings 
    InputMap inputMap = button.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
    ActionMap actionMap = button.getActionMap(); 

    // add key bindings for pressing and releasing the button 
    inputMap.put(keyPress,"press"+keyCode); 
    actionMap.put("press"+keyCode, new ButtonPress(button)); 

    inputMap.put(keyReleaseWithShift,"releaseWithShift"+keyCode); 
    actionMap.put("releaseWithShift"+keyCode, new ButtonRelease(button)); 

    ///* 
    // add key binding for releasing SHIFT before A 
    // if you use more than one modifier it gets really messy 
    KeyStroke keyReleaseAfterShift = KeyStroke.getKeyStroke(keyCode,0,true); 
    inputMap.put(keyReleaseAfterShift,"releaseAfterShift"+keyCode); 
    actionMap.put("releaseAfterShift"+keyCode, new ButtonRelease(button)); 
    //*/ 
    } 

    class ButtonPress extends AbstractAction 
    { 
    private JButton button; 
    private ButtonModel model; 
    ButtonPress(JButton button) 
    { 
     this.button = button; 
     this.model = button.getModel(); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     // visually press the button 
     model.setPressed(true); 
     model.setArmed(true); 

     button.requestFocusInWindow(); 
    } 
    } 

    class ButtonRelease extends AbstractAction 
    { 
    private ButtonModel model; 
    ButtonRelease(JButton button) 
    { 
     this.model = button.getModel(); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     if (model.isPressed()) { 
     // visually release the button 
     // setPressed(false) also makes the button fire an ActionEvent 
     model.setPressed(false); 
     model.setArmed(false); 
     } 
    } 
    } 
} 
0

@ Courteaux के जवाब के आधार पर, इस विधि एक JTable में पहला कक्ष क्लिक करता है: [? मैं कैसे प्रोग्राम के JButton को ActionEvent भेजूँ]

private void clickFirstCell() { 
    try { 
     jTable1.changeSelection(0, 0, false, false); 
     Point p = jTable1.getLocationOnScreen(); 
     Rectangle cellRect = jTable1.getCellRect(0, 0, true); 
     Robot r = new Robot(); 
     Point mouse = MouseInfo.getPointerInfo().getLocation(); 
     r.mouseMove(p.x + cellRect.x + cellRect.width/2, 
       p.y + cellRect.y + cellRect.height/2); 
     r.mousePress(InputEvent.BUTTON1_MASK); 
     try { 
      Thread.sleep(50); 
     } catch (Exception e) { 
     } 
     r.mouseRelease(InputEvent.BUTTON1_MASK); 
     r.mouseMove(mouse.x, mouse.y); 
    } catch (AWTException ex) { 
    } 
} 
संबंधित मुद्दे