2012-10-03 15 views
8

Ich versuche, JavaFX Mnemonic arbeiten zu lassen. Ich habe einen Button in der Szene und was ich erreichen möchte, ist dieses Button Event durch Drücken von Strg + S auszulösen. Hier ist ein Code sceleton:Verwenden von JavaFX 2.2 Mnemonic (und Beschleuniger)

@FXML 
public Button btnFirst; 

btnFirst.getScene().addMnemonic(new Mnemonic(btnFirst, 
      new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN))); 

Knopf des mnemonicParsing ist falsch. (Nun, während ich versuche, das zu machen, habe ich versucht, es auf wahr zu setzen, aber kein Ergebnis). Die JavaFX-Dokumentation besagt, dass, wenn eine Mnemonic in einer Szene registriert ist und die KeyCombination die unverbrauchte Szene erreicht, der Zielknoten ein ActionEvent gesendet wird. Aber das funktioniert nicht, wahrscheinlich mache ich falsch ...

Ich kann die mnemonic der Standard-Taste verwenden (indem Sie mnemonicParsing auf True und Präfix 'F' Buchstaben durch Unterstreichungszeichen). Aber auf diese Weise Benutzer muss Alt-Taste, die seltsames Verhalten in Browsern mit Menüleiste (wenn Anwendung in Web-Seite als Browser-Menü aktiviert ausgelöst wird nach dem Auslösen Schaltfläche Ereignis durch Drücken von Alt + S) seltsames Verhalten bringt. Außerdem macht es der Standard Weg unmöglich, Verknüpfungen wie Strg + Shift + F3 und so weiter zu machen.

Also, wenn es eine Möglichkeit gibt, dies zu tun?

Antwort

20

Für Ihren Anwendungsfall glaube ich, dass Sie eigentlich lieber einen Beschleuniger als einen Mnemonic verwenden möchten.

button.getScene().getAccelerators().put(
    new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN), 
    new Runnable() { 
    @Override public void run() { 
     button.fire(); 
    } 
    } 
); 

In den meisten Fällen empfiehlt es sich, dass Sie KeyCombination.SHORTCUT_DOWN als Modifikator Spezifizierer, wie in dem obigen Code verwenden. Eine gute Erklärung hierfür ist in der KeyCombination Dokumentation:

Die Verknüpfung Modifikator die Sondertaste darzustellen, die häufig in Tastenkombinationen verwendet wird, auf der Host-Plattform verwendet wird. Dies ist für Beispielsteuerung unter Windows und Meta (Befehlstaste) auf Mac. Mithilfe von Shortcut Key Modifier können Entwickler plattformunabhängige Verknüpfungen erstellen. Die Tastenkombination "Tastenkombination + C" wird intern als "Strg + C" unter Windows und "Meta + C" unter Mac behandelt.

Wenn Sie Code wollte spezifisch nur eine Strg + S Tastenkombination zu handhaben, sie könnten Sie verwenden:

new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN) 

Hier ist ein ausführbares Beispiel:

import javafx.animation.*; 
import javafx.application.Application; 
import javafx.event.*; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.image.*; 
import javafx.scene.input.*; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class SaveMe extends Application { 
    @Override public void start(final Stage stage) throws Exception { 
    final Label response = new Label(); 
    final ImageView imageView = new ImageView(
     new Image("http://icons.iconarchive.com/icons/gianni-polito/colobrush/128/software-emule-icon.png") 
    ); 
    final Button button = new Button("Save Me", imageView); 
    button.setStyle("-fx-base: burlywood;"); 
    button.setContentDisplay(ContentDisplay.TOP); 
    displayFlashMessageOnAction(button, response, "You have been saved!"); 

    layoutScene(button, response, stage); 
    stage.show(); 

    setSaveAccelerator(button); 
    } 

    // sets the save accelerator for a button to the Ctrl+S key combination. 
    private void setSaveAccelerator(final Button button) { 
    Scene scene = button.getScene(); 
    if (scene == null) { 
     throw new IllegalArgumentException("setSaveAccelerator must be called when a button is attached to a scene"); 
    } 

    scene.getAccelerators().put(
     new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN), 
     new Runnable() { 
     @Override public void run() { 
      fireButton(button); 
     } 
     } 
    ); 
    } 

    // fires a button from code, providing visual feedback that the button is firing. 
    private void fireButton(final Button button) { 
    button.arm(); 
    PauseTransition pt = new PauseTransition(Duration.millis(300)); 
    pt.setOnFinished(new EventHandler<ActionEvent>() { 
     @Override public void handle(ActionEvent event) { 
     button.fire(); 
     button.disarm(); 
     } 
    }); 
    pt.play(); 
    } 

    // displays a temporary message in a label when a button is pressed, 
    // and gradually fades the label away after the message has been displayed. 
    private void displayFlashMessageOnAction(final Button button, final Label label, final String message) { 
    final FadeTransition ft = new FadeTransition(Duration.seconds(3), label); 
    ft.setInterpolator(Interpolator.EASE_BOTH); 
    ft.setFromValue(1); 
    ft.setToValue(0); 
    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override public void handle(ActionEvent event) { 
     label.setText(message); 
     label.setStyle("-fx-text-fill: forestgreen;"); 
     ft.playFromStart(); 
     } 
    }); 
    } 

    private void layoutScene(final Button button, final Label response, final Stage stage) { 
    final VBox layout = new VBox(10); 
    layout.setPrefWidth(300); 
    layout.setAlignment(Pos.CENTER); 
    layout.getChildren().addAll(button, response); 
    layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 20; -fx-font-size: 20;"); 
    stage.setScene(new Scene(layout)); 
    } 

    public static void main(String[] args) { launch(args); } 
} 
// icon license: (creative commons with attribution) http://creativecommons.org/licenses/by-nc-nd/3.0/ 
// icon artist attribution page: (eponas-deeway) http://eponas-deeway.deviantart.com/gallery/#/d1s7uih 

Beispielausgabe:

Sample program output

+0

jewelsea, danke yo u. Du hast absolut recht, Beschleuniger sind mein Anwendungsfall. Ich dachte fälschlicherweise, dass Beschleuniger mit Menüpunkten verbunden werden müssen. Danke für deine Lektion. – bes67

+2

Hinweis: bevorzugen Sie "Verknüpfung" über "Kontrolle" (Windows) oder "Meta" (Mac), um Ihre Anwendung unabhängig von der Plattform zu halten. – Puce

+2

Danke Puce, es ist gut, 'SHORTCUT_DOWN' statt' CONTROL_DOWN' zu verwenden. Ich habe die Antwort aktualisiert, um diese Empfehlung aufzunehmen. – jewelsea

Verwandte Themen