以编程方式在Java Swing中单击GUIbutton

我将如何以编程方式单击一个Swing JButton的方式,将注册所有相关的动作/鼠标事件,并为用户可见(即他们会看到button被按下,就好像他们实际上点击它)?

该button与我正在运行的同一个应用程序中; 我不想控制另一个应用程序中的button。 我想我可以直接将事件插入队列中,但是如果可能的话,我宁愿避免这种方法,这样做不会显示可见的点击。

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

你有没有尝试过使用doClick() ?

如果doClick()不是你想要的,你可以将鼠标移动到button上并按下它:

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

你总是可以通过发射一个动作事件来模拟它。

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

要启动它,请创build上面的操作事件,以及任何您想要调用的监听器

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

即使button.doClick()者对button.doClick()满意,我正在寻找类似于设置助记符(即button.setMnemonic(KeyEvent.VK_A)后发生的事情。 你实际上可以按住ALT + A而不发生任何事情(除了视觉上的变化)。 当释放键A(有或没有ALT)时,button触发一个ActionEvent。

我发现我可以通过button.getModel()获取ButtonModel(参见Java 8 API button.getModel() ,然后用model.setPressed(true); model.setArmed(true);按下buttonmodel.setPressed(true); model.setArmed(true); model.setPressed(true); model.setArmed(true); (两者都通过助记符进行更改),并通过将两者都设置为false来在视觉上释放button。 而当model.setPressed(false)在button和布防button被调用时,button会自动触发一个ActionEvent(调用model.setArmed(false)只会直观地改变button)。

[来自ButtonModel的Java API文档的引用]触发一个button,并触发一个ActionEvent,当鼠标在模型布防的时候被释放

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

工作代码:按SHIFT + A直观地按下button(相比之下,在用button.setMnemonic()设置助记符后用键按ALT)。 然后释放键以在控制台上打印动作命令(“button”)。

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

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

基于@ Courteaux的回答,这个方法点击了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(px + cellRect.x + cellRect.width / 2, py + 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) { } } 
    Interesting Posts