Ответ 1
Вы пытались использовать doClick()?
Как бы я программным образом щелкнул Swing JButton таким образом, чтобы регистрировать все соответствующие события действия/мыши и быть видимыми пользователю (т.е. они будут нажимать кнопку, как будто они на самом деле нажали)?
Кнопка находится в том же приложении, в котором я запущен; Я не пытаюсь управлять кнопкой в другом приложении. Я предполагаю, что я мог бы непосредственно вводить события в очередь, но я предпочел бы избежать этого подхода, если это возможно, и при этом он не будет показывать видимый щелчок.
Я вижу, что класс java.awt.Robot предлагает методы для перемещения мыши и нажатия мыши, но не для того, чтобы щелкнуть по определенной кнопке.
Вы пытались использовать doClick()?
Если 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);
}
Вы всегда можете имитировать его, активировав событие события с ним в качестве источника.
http://download.oracle.com/javase/6/docs/api/java/awt/event/ActionEvent.html
Чтобы запустить его, создайте событие действия выше, и любой слушатель, которого вы хотите просто вызвать
ActionEvent e = new ActionEvent(myButton,1234,"CommandToPeform");
myListener.actionPerformed(e);
Несмотря на то, что обходящийся был удовлетворен 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)
только визуально изменяет кнопку).
[Цитата из документации API Java ButtonModel] Кнопка запускается, и активируется ActionEvent, когда мышь отпускается во время постановки на охрану модели [...]
Чтобы приложение реагировало на нажатия клавиш, когда кнопка видна (без содержимого окна или кнопки, которая должна быть владельцем фокуса, то есть когда фокусируется другой компонент в окне), я использовал привязки клавиш (см. Официальное руководство по Java).
Рабочий код: Нажмите SHIFT + A, чтобы визуально нажать кнопку (в отличие от нажатия ALT с помощью клавиши после того, как мнемоника установлена с помощью button.setMnemonic()
). И отпустите клавишу, чтобы напечатать команду действия ("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(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) {
}
}