내 Java 응용 프로그램에서 모든 jbuttons의 트리거 키로 Enter를 할당하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/440209

  •  22-07-2019
  •  | 
  •  

문제

금속 모양과 느낌을 사용하여 Java Swing 애플리케이션을 작성하고 있습니다. 내 응용 프로그램에 jbutton이있을 때마다 사용자는 탭 키를 사용하여 초점을 버튼으로 이동 한 다음 Enter 키를 누릅니다. 아무 반응이 없습니다! 그가 공간 키에 부딪히면 버튼 이벤트가 발사됩니다. 공간 키와 동일한 이벤트를 트리거하기 위해 Enter 키를 할당하려면 어떻게해야합니까? 도와 주셔서 감사합니다.

도움이 되었습니까?

해결책

다음을 찾았습니다.

http://tips4java.wordpress.com/2008/10/25/enter-key-and-button/

Rob Camick은 JDK5를 사용할 때 나중에 추가 할 때 간단히 추가합니다 ...

UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);

... 문제를 해결하기 위해 응용 프로그램에. 이것은 나를 위해 트릭을했다! 그리고 나는 더 간단한 것을 상상할 수 없습니다. 그러나 이전 버전의 Java를 사용할 때 Richard와 Peter와 같은 일을해야합니다.

다른 팁

다음은 완전한 예입니다. Richard는 가까웠지만 릴리스가 아니라 Pressed Enter가 행동에 대한지도를 맵핑해야합니다. 모든 버튼에서 작동하도록하기 위해이 매핑을 버튼의 기본 입력 맵에 넣었습니다. 가져 오기를 추가하면 실행할 수 있어야합니다.


public class Main implements Runnable {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Main());
    }

    @Override
    public void run() {
        setupEnterActionForAllButtons();

        JFrame frame = new JFrame("Button test");
        frame.getContentPane().add(createButton(), BorderLayout.NORTH);
        frame.getContentPane().add(createButton(), BorderLayout.SOUTH);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);
    }

    private void setupEnterActionForAllButtons() {
        InputMap im = (InputMap) UIManager.getDefaults().get("Button.focusInputMap");
        Object pressedAction = im.get(KeyStroke.getKeyStroke("pressed SPACE"));
        Object releasedAction = im.get(KeyStroke.getKeyStroke("released SPACE"));

        im.put(KeyStroke.getKeyStroke("pressed ENTER"), pressedAction);
        im.put(KeyStroke.getKeyStroke("released ENTER"), releasedAction);
    }

    private JButton createButton() {
        JButton b = new JButton("press enter");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Pressed");
            }
        });

        return b;
    }
}

실제로 이것은 모양과 느낌의 문제입니다. 어떤 키가 집중 버튼을 트리거하는지에 대한 외관과 느낌에 달려 있습니다.

"기본 버튼"작업은 사용중인 L & F가 기본 버튼에 Enter Enter 이후로 작동합니다.

Peter의 해결 방법은 L & F 기본 "Focus Action"키를 명시 적으로 변경합니다.이 키는 나에게 물어 보면 다소 설득력이 있습니다.

나는 많은 사용자들이 버튼에 탭하고 Enter를 누르고 싶지 않다고 생각하지 않을 것이라고 덧붙일 것입니다 (대부분은 초점 표시기를 눈치 채지 못할 것입니다) - 기본 조치가 "오른쪽"이되기를 원하고 누른 곳이기를 원합니다. 입력하다. Richard가 제안한대로 입력 맵으로 만 수행 할 수 있습니다.

전 세계적으로 변경하기 전에 사용자가 실제로 원하는 것과 기대하는 것 (바람직하게 사용하는 다른 앱과 관련하여)에 대해 매우 명확한 그림을 얻는 것이 좋습니다.

Enter 키에 대한 입력 / 액션 맵을 할당하여 수행합니다. 다음과 같은 것 :

// save the command mapping for space
Object spaceMap = button.getInputMap.get(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, true));
// add a mapping from enter to the same command.
button.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, true),spaceMap); 

가장 최근에 초점을 맞춘 버튼으로 "기본 버튼"을 설정할 수도 있습니다.

나는 응용 프로그램에서 이것을했다. 그리고 이것을 수행하는 모든 방법은 유지하고 디버그하는 악몽이다. 사실, 이것은 분명히 스윙의 디자이너가 의도 한 것이 아닙니다.

라디오, 확인란과 동일하게하기 위해 위의 답변으로 확장됩니다. 구성 요소를 만들기 전에 이것을 불렀습니다

void setupEnterAction(String componentName){
    String keyName = componentName + ".focusInputMap";
    InputMap im = (InputMap) UIManager.getDefaults().get(keyName);
    Object pressedAction = im.get(KeyStroke.getKeyStroke("pressed SPACE"));
    Object releasedAction = im.get(KeyStroke.getKeyStroke("released SPACE"));
    im.put(KeyStroke.getKeyStroke("pressed ENTER"), pressedAction);
    im.put(KeyStroke.getKeyStroke("released ENTER"), releasedAction);
}

public void setEnterEvent(){
    setupEnterAction("Button");
    setupEnterAction("RadioButton");
    setupEnterAction("CheckBox");
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top