当前位置: 首页 > 知识库问答 >
问题:

以编程方式单击Java Swing中的GUI按钮

廉飞捷
2023-03-14

我如何以编程方式单击Swing JButton,使其注册所有相关的动作/鼠标事件,并对用户可见(即,他们会看到按钮被按下,就好像他们真的单击了它一样)?

该按钮位于我正在运行的同一应用程序中; 我不是试图控制另一个应用程序中的按钮。 我想我可以直接将事件注入到队列中,但是如果可能的话,我更愿意避免这种方法,这样做不会显示可见的单击。

我看到java.awt.Robot类提供了移动鼠标和单击鼠标的方法,但不是让它单击某个特定按钮。

共有3个答案

潘学民
2023-03-14

尽管询问者对button.doClick()感到满意,但我正在寻找类似于设置助记符后发生的情况,即使用button.setMnemonic(keyevent.vk_a)。 实际上,你可以按住ALT+A而不发生任何事情(除了视觉上的改变)。 在释放A键(带或不带ALT)时,按钮激发ActionEvent。

我发现可以用button.getModel()获得ButtonModel(参见Java 8 API),然后用model.setPressed(true)可视化地按下按钮; model.setarmed(true);(两者都通过助记符更改),并通过将两者都设置为false来可视地释放按钮。 当在按钮同时按下和启动时调用model.SetArmed(false)时,按钮将自动激发ActionEvent(调用model.SetArmed(false)仅在视觉上更改按钮)。

[引用ButtonModel Java API文档]当模型处于武装状态时释放鼠标时,按钮被触发,ActionEvent被激发[...]

为了使应用程序在按钮可见时(没有包含窗口或按钮需要成为焦点所有者,即当窗口中的另一个组件被聚焦时)对按键作出反应,我使用了键绑定(参见Java官方教程)。

工作代码:按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);
      }
    }
  }
}
养慈
2023-03-14

如果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);
}
轩辕庆
2023-03-14

您尝试过使用doClick()吗?

 类似资料:
  • 问题内容: 我将如何以编程方式单击Swing JButton,该方式将注册所有相关的动作/鼠标事件并且对用户可见(即,他们将看到按下的按钮就好像他们实际单击了按钮一样)? 该按钮位于我正在运行的同一应用程序中;我不是要控制另一个应用程序中的按钮。我想我可以将事件直接注入到队列中,但是如果可能的话,我宁愿避免这种方法,并且这样做不会显示可见的点击。 我看到java.awt.Robot类提供了移动鼠标

  • 问题内容: 我有2个视图控制器,应根据用户输入进行交换。因此,我想根据从文本文件获得的输入以编程方式切换视图。 关于如何以编程方式单击按钮或使用输入加载特定ViewController的任何帮助? 问题答案: 要以编程方式触发事件,您需要致电 - 迅捷3

  • 我如何以编程方式单击通知操作按钮(另一个应用程序通知,而不是我的)?我可以使用 ;button.performClick()方法单击普通按钮。我有可访问性服务来监听传入的通知(和通知服务监听到Android5.0+),所以,有没有办法做到这一点? 例如,单击“打开电池保护程序”或“实用地共享/删除”

  • 有没有一种方法以编程方式点击文本字段,这样当我的搜索屏幕弹出时,它会自动点击文本字段,同时弹出键盘。或者也许,有没有一种方法可以知道TextField的touch事件?

  • 问题内容: 在IE中,我只能从JavaScript调用element.click()-如何在Firefox中完成相同的任务?理想情况下,我希望有一些跨浏览器同样可以正常工作的JavaScript,但是如果需要,我将为此使用不同的逐浏览器JavaScript。 问题答案: 该文件说:“ 该 _createEvent_方法已被弃用。使用事件构造来代替。 ” 因此,您应该改用以下方法: 并在这样的元素上

  • 我想知道是否有任何“简单”的方法,我可以设置垂直滚动条“滚动”一个特定的数量,按下按钮,或真正的任何事件在所有。 例如,我有一个应用程序,它有一个侧栏,侧栏上的一个选项是设置。Settings有子项,我想添加点击其中一个子项的功能,它将打开Settings页面,并自动向下滚动到该子项所在页面上的特定点。

  • 嗨,我是一个网络抓取新手,一直在尝试使用Selenium用python抓取论坛 我想让Selenium点击"下一步",直到最后一页,但我不知道如何打破循环。 当我通过部分链接找到下一个按钮时,自动单击将继续到下一个线程,例如page1- 当我按类名找到下一个按钮时,自动单击将在到达最后一页时单击“prev”按钮 我的问题是: 我应该使用哪个定位器?(按类还是按部分链接或任何其他建议? 如何打破循环

  • 我想用JavaSwing创建以下GUI。 由于我对Java Swing没有足够的经验,所以我不确定如何准确地重新创建该GUI。 我尝试过使用GridLayout,如下所示: 我已经尝试过其他的布局管理器,但是由于我缺乏经验,我无法得到任何与我想要实现的图形用户界面相类似的东西。 我可能不得不使用GridBagLayout,但我已经尝试过了,根本无法完成任何事情。我不确定如何确切地使用GridBag