Programmatically clicking a GUI button in Java Swing

前端 未结 6 912
灰色年华
灰色年华 2020-12-13 23:06

How would I programmatically click a Swing JButton in a way that would register all the relevant action/mouse events and be visible to the user (i.e. they\'d see the button

相关标签:
6条回答
  • 2020-12-13 23:49

    Have you tried using doClick()?

    0 讨论(0)
  • 2020-12-13 23:49

    Based on @Courteaux's answer, this method clicks the first cell in a JTable:

    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) {
        }
    }
    
    0 讨论(0)
  • 2020-12-13 23:51

    If doClick() is not what you want, you can move the mouse really to the button and press it:

    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 讨论(0)
  • 2020-12-13 23:55

    From: http://download.oracle.com/javase/6/docs/api/javax/swing/JButton.html

    /**
     * Click a button on screen
     *
     * @param button Button to click
     * @param millis Time that button will remain "clicked" in milliseconds
     */
    public void click(AbstractButton button, int millis) {
       b.doClick(millis);
    }
    
    0 讨论(0)
  • 2020-12-13 23:59

    Even though the asker was satisfied with button.doClick(), I was looking for something like what happens after setting a mnemonic, i.e. with button.setMnemonic(KeyEvent.VK_A). You can actually hold down ALT + A without anything happening (except the visual change). And upon release of the key A (with or without ALT), the button fires an ActionEvent.

    I found that I can get the ButtonModel (see Java 8 API) with button.getModel(), then visually press the button with model.setPressed(true); model.setArmed(true); (both are changed by mnemonics), and visually release the button by setting both to false. And when model.setPressed(false) is called while the button is both pressed and armed, the button fires an ActionEvent automatically (calling model.setArmed(false) only changes the button visually).

    [Quote from ButtonModel Java API documentation] A button is triggered, and an ActionEvent is fired, when the mouse is released while the model is armed [...]

    To make the application react to key presses when the button is visible (without the containing window or the button needing to be the focus owner, i.e. when another component in the window is focussed) I used key bindings (see the Official Java Tutorial).

    Working code: Press SHIFT + A to visually press the button (in contrast to pressing ALT with the key after the mnemonic is set with button.setMnemonic()). And release the key to print the action command ("button") on the console.

    // 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 讨论(0)
  • 2020-12-14 00:05

    You could always simulate it by firing an action event with it as the source.

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

    To fire it, create the action event above, and whatever listener you want just call

    ActionEvent e = new ActionEvent(myButton,1234,"CommandToPeform");
    myListener.actionPerformed(e);
    
    0 讨论(0)
提交回复
热议问题