Wie kann ich assign als Auslöser Schlüssel aller JButtons in meiner Java-Anwendung eingeben?

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

  •  22-07-2019
  •  | 
  •  

Frage

Ich schreibe eine Java Swing-Anwendung mit dem Metall-Look-and-Feel. Jedes Mal gibt es eine JButton in meiner Anwendung verwendet der Benutzer die Tabulatortaste den Fokus auf die Schaltfläche zu bewegen und trifft dann auf die Eingabetaste. Nichts passiert! Wenn er die Leertaste trifft die Schaltfläche Ereignisse ausgelöst. Wie ordne ich die Enter-Taste die gleichen Ereignisse wie die Leertaste auslösen? Vielen Dank für Ihre Hilfe.

War es hilfreich?

Lösung

Ich fand das folgende:

http://tips4java.wordpress.com/2008 / 10/25 / Enter-Taste-und-Taste /

Wo Rob Camick schreibt, dass, wenn JDK5 höher verwenden Sie einfach hinzufügen ...

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

... zur Anwendung, das Problem zu lösen. Dies hat den Trick für mich! Und ich kann nichts einfacher vorstellen. Wenn jedoch ältere Versionen von Java verwenden Sie haben so etwas wie Richard und Peter tun beschreiben in ihren Antworten auf diese Frage.

Andere Tipps

Hier ist vollständiges Beispiel. Richard war in der Nähe, aber Sie müssen auch gedrückt Aktion zur Karte ENTER, nicht nur freigegeben. Um es für alle Tasten funktioniert, habe ich diese Zuordnung setzen Eingabekarte für Tasten auf Standard. In Importe, und es sollte runnable sein.


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

Eigentlich ist dies ein Look and Feel Problem. Es ist (und sollte) bis zu dem Aussehen und das Gefühl, als, auf die Taste, um die fokussierte Taste auslöst.

Die „Standardschaltfläche“ work-around arbeitet seit dem L & F Sie Anwendungen eingeben, für die Standardschaltfläche verwenden.

Peter Abhilfe ändert explizit die L & F default „Fokus Aktion“ Taste -., Die etwas überzeugender, wenn Sie mich fragen,

Ich möchte hinzufügen, dass ich nicht glaube, viele Benutzer auf die Registerkarte wollen würde die Taste dann die Eingabetaste drücken (die meisten werden nicht einmal die Fokusanzeige bemerken) - sie wollen die Standard-Aktion der „richtige“ ein und Arbeit sein wo sie die Eingabetaste drücken. Dies kann nur mit Eingangskarten erfolgen, wie Richard vermuten läßt.

Ich würde vorschlagen, sicherlich ein sehr klares Bild zu bekommen, was Ihre Nutzer eigentlich wollen und erwarten (vorzugsweise mit Bezug auf andere Anwendungen sie verwenden), bevor irgendetwas global zu verändern.

Sie tun es durch eine Eingabe / Aktionskarte für die Enter-Taste zuweisen. Etwas wie folgt aus:

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

Sie können auch die „Standardschaltfläche“ auf die Schaltfläche zuletzt fokussiert.

Ich tat dies auf eine Anwendung, und alle Methoden, dies zu tun sind ein Alptraum zu halten und zu debuggen. Tatsache ist, das ist eindeutig nicht das, was der Designer of Swing sollte geschehen.

Erweiterung oben Antworten zu tun gleiche mit Radio, Kontrollkästchen. Genannt dies vor Erstellen von Komponenten

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");
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top