56

関連するすべてのアクション/マウスイベントを登録し、ユーザーに表示されるようにプログラムで Swing JButton をクリックするにはどうすればよいでしょうか (つまり、実際にクリックしたかのようにボタンが押されているのを確認できます)。

ボタンは、実行中の同じアプリケーションにあります。別のアプリケーションでボタンを制御しようとしているわけではありません。イベントをキューに直接注入することもできると思いますが、可能であればそのアプローチを避けたいと思います。そのようにすると、目に見えるクリックが表示されません。

java.awt.Robot クラスは、マウスを動かしたりクリックしたりするメソッドを提供していますが、特定のボタンをクリックさせるメソッドは提供していません。

4

6 に答える 6

108

doClick()を使ってみましたか?

于 2011-02-24T19:12:09.170 に答える
11

希望どおりでない場合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);
}
于 2011-02-24T19:31:11.187 に答える
3

質問者は に満足してbutton.doClick()いましたが、ニーモニックを設定した後、つまり で何が起こるかのようなものを探していましたbutton.setMnemonic(KeyEvent.VK_A)。実際には、何も起こらずに ALT + A を押し続けることができます (視覚的な変化を除く)。キー A (ALT の有無にかかわらず) を離すと、ボタンは ActionEvent を発生させます。

で ButtonModel ( Java 8 APIを参照) を取得しbutton.getModel()、 でボタンを視覚的に押しmodel.setPressed(true); model.setArmed(true);(どちらもニーモニックによって変更されます)、両方を に設定して視覚的にボタンを離すことができることがわかりましたfalse。またmodel.setPressed(false)、ボタンが押されてアームされている間に が呼び出されると、ボタンは ActionEvent を自動的に起動します (呼び出しmodel.setArmed(false)はボタンを視覚的に変更するだけです)。

[ButtonModel Java API ドキュメントからの引用] モデルがアームされているときにマウスが離されると、ボタンがトリガーされ、ActionEvent が発生します [...]

ボタンが表示されているときにアプリケーションがキーの押下に反応するようにするために (つまり、ウィンドウ内の別のコンポーネントがフォーカスされている場合に、含まれているウィンドウまたはボタンがフォーカスの所有者である必要はありません)、キー バインドを使用しました (公式 Java チュートリアルを参照)。

作業コード: SHIFT + A を押してボタンを視覚的に押します (ニーモニックが で設定された後に キーで ALT を押すのとは対照的ですbutton.setMnemonic())。キーを放して、コンソールにアクション コマンド (「ボタン」) を出力します。

// 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);
      }
    }
  }
}
于 2014-05-23T15:17:05.983 に答える
2

それをソースとしてアクションイベントを発生させることで、いつでもシミュレートできます。

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

それを起動するには、上記のアクションイベントを作成し、呼び出したいリスナーを何でも呼び出します

ActionEvent e = new ActionEvent(myButton,1234,"CommandToPeform");
myListener.actionPerformed(e);
于 2011-02-24T19:12:07.890 に答える
1

差出人: 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);
}
于 2011-02-24T19:14:27.437 に答える