2017-05-23 4 views
2

Ich habe eine JavaFX-Anwendung, die verschiedene TextField Widgets im Hauptrahmen hat. Ich habe eine MenuBar, die die MenuItem Objekte enthält "Kopieren" und "Einfügen" wie eine Standardproduktionsanwendung hätte. Da beliebige oder keine der verschiedenen TextField Objekte zu einem bestimmten Zeitpunkt ausgewählt werden können, scheint es einfacher zu sein, einfach eine "Strg + C" oder "Strg + V" Taste zu drücken, drücken Sie die setOnAction Ereignisse von "Kopieren" und "Einfügen" MenuItem Objekte eher als ein Clipboard Objekt und Schleife durch alle TextFields durchlaufen, um den markierten Text (falls vorhanden) zu finden.JavaFX: Hardcode a "Strg + C" Tastendruck

Gibt es eine Möglichkeit, diese Taste drücken Aktion in Java? Ich schaute in die KeyCombination Klasse, aber es löst nicht wirklich die durch die gegebene Tastenkombination beschriebene Handlung aus.

+1

Hard ein 'Strg + C' Tastendruck ??? Iterate durch die Felder? Können Sie erklären, was Sie damit meinen ??? (Ein Schlüsselereignis selbst auf einem Nachkommenknoten des 'TextFeld' oder ähnlichem auslösen!) – fabian

+0

Ich denke, ich habe das Problem ziemlich gut erklärt, aber hier ist der Pseudocode:' Clipboard.execute ("Strg + C") ' . Und ja, die alternative Lösung besteht darin, alle "TextField" -Objekte in ein Array zu setzen, iterieren durch das Array nach dem ersten "TextField" mit einer 'getSelected()' -Eigenschaft, die wahr ist. – jshapy8

+0

Textfeld hat keine 'getSelected()' Methode. Beziehen Sie sich darauf, den Fokus zu haben? –

Antwort

3

Ich denke durch "Da irgendwelche oder keine der verschiedenen TextField Objekte zu einem bestimmten Zeitpunkt ausgewählt werden konnten" beziehen Sie sich auf das (falls vorhanden) Textfeld hat den Tastaturfokus.

Sie können diese Informationen aus der Szene bekommen: nur tun

Node focusOwner = scene.getFocusOwner(); 
if (focusOwner instanceof TextField) { 
    TextField textField = (TextField) focusOwner ; 
    String selectedText = textField.getSelectedText(); 
    // ... 
} 

Beachten Sie auch, dass TextInputControl definiert eine copy() Methode, die kopiert den markierten Text in die Zwischenablage. (Ebenso gibt es eine paste() Methode.) Sie können diese also nutzen, um die Funktionalität zu vereinfachen.

Hier ist ein SSCCE:

import javafx.application.Application; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Menu; 
import javafx.scene.control.MenuBar; 
import javafx.scene.control.MenuItem; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TextInputControl; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class FocusMenuTest extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     BorderPane root = new BorderPane(); 
     VBox textFields = new VBox(5, new TextField("One"), new TextField("Two"), new TextField("Three")); 
     MenuBar menuBar = new MenuBar(); 
     Menu edit = new Menu("Edit"); 
     MenuItem copy = new MenuItem("Copy"); 

     copy.setOnAction(e -> { 
      Node focusOwner = menuBar.getScene().getFocusOwner(); 
      if (focusOwner instanceof TextInputControl) { 
       ((TextInputControl)focusOwner).copy(); 
      } 
     });  

     MenuItem paste = new MenuItem("Paste"); 
     paste.setOnAction(e -> { 
      Node focusOwner = menuBar.getScene().getFocusOwner(); 
      if (focusOwner instanceof TextInputControl) { 
       ((TextInputControl)focusOwner).paste(); 
      } 
     }); 

     menuBar.getMenus().add(edit); 
     edit.getItems().addAll(copy, paste); 
     root.setCenter(textFields); 
     root.setTop(menuBar); 
     Scene scene = new Scene(root, 400, 400); 


     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Vielen Dank. – jshapy8

Verwandte Themen