54 votes

Par programme en cliquant sur un bouton GUI en Java Swing

Comment I du programme, cliquez sur une Balançoire JButton de manière à enregistrer toutes les actions/événements de souris et d'être visible pour l'utilisateur (c'est à dire qu'ils verraient d'appuyer sur le bouton comme si ils ont effectivement cliqué dessus)?

Le bouton se trouve dans la même application que je suis en cours d'exécution; je ne suis pas en train de contrôler un bouton dans une autre application. Je suppose que je pourrais directement injecter des événements dans la file d'attente, mais je préfère éviter cette approche, si possible, et de le faire de cette façon ne serait pas visible, cliquez sur.

Je vois la java.awt.Robot de classe offre des méthodes pour déplacer la souris et cliquer avec la souris, mais pas pour le faire cliquez sur un bouton particulier.

99voto

JasCav Points 18931

Avez-vous essayé d'utiliser doClick()?

11voto

Martijn Courteaux Points 33836

Si doClick() n'est pas ce que vous voulez, vous pouvez déplacer la souris vraiment à la touche et appuyez sur ce bouton:

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);
}

3voto

mkdrive2 Points 11

Même si le demandeur a satisfait button.doClick(), je cherchais quelque chose comme ce qui se passe après la définition d'une mnémonique, c'est à dire avec button.setMnemonic(KeyEvent.VK_A). Vous pouvez réellement maintenez les touches ALT + UN sans que rien ne se passe (à l'exception du changement de visuel). Et lors de la libération de la clé (avec ou sans la touche ALT), le bouton déclenche un ActionEvent.

J'ai trouvé que je peux obtenir de la ButtonModel (voir Java 8 API) avec button.getModel(), alors visuellement appuyez sur le bouton avec model.setPressed(true); model.setArmed(true); (les deux sont modifiés par des mnémoniques), et visuellement relâchez le bouton en définissant à la fois à l' false. Et lorsqu' model.setPressed(false) est appelée lorsque le bouton est à la fois pressé et armés, le bouton déclenche un ActionEvent automatiquement (en appelant model.setArmed(false) seulement des changements sur le bouton visuellement).

[Citation de ButtonModel Java documentation de l'API] Un bouton est déclenchée, et un ActionEvent est déclenché, lorsque la souris est relâché alors que le modèle est armé [...]

Pour faire la demande de réagir aux pressions sur les touches lorsque le bouton est visible (sans le contenant de la fenêtre ou sur le bouton de devoir être le centre d'intérêt du propriétaire, c'est à dire quand un autre composant dans la fenêtre est centrée), j'ai utilisé les raccourcis clavier (voir l' Officiel de Java Tutoriel).

Code de travail: Appuyez sur MAJ + A pour déficients appuyez sur le bouton (contrairement à la touche ALT avec la clé après le mnémonique est configuré avec l' button.setMnemonic()). Et relâchez la touche pour imprimer la commande d'action ("bouton") sur la 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);
      }
    }
  }
}

2voto

corsiKa Points 39442

Vous pouvez toujours réaliser une simulation de tir d'un événement d'action avec comme source.

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

Pour le feu, créer l'événement d'action ci-dessus, et quel que soit écouteur vous voulez appelez simplement

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

1voto

Michael K Points 947

De: 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);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X