programing

Java Swing에서 프로그래밍 방식으로 GUI 버튼 클릭

goodcopy 2021. 1. 18. 22:04
반응형

Java Swing에서 프로그래밍 방식으로 GUI 버튼 클릭


모든 관련 동작 / 마우스 이벤트를 등록하고 사용자에게 표시되는 방식으로 프로그래밍 방식으로 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);
}

질문자가에 만족했지만 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);
      }
    }
  }
}

소스로 액션 이벤트를 발생시켜 항상 시뮬레이션 할 수 있습니다.

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

To fire it, create the action event above, and whatever listener you want just call

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

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

Based on @Courteaux's answer, this method clicks the first cell in a 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) {
    }
}

ReferenceURL : https://stackoverflow.com/questions/5109274/programmatically-clicking-a-gui-button-in-java-swing

반응형