2017-11-19 3 views
0

Im Grunde versuche ich etwas wie ein textbasiertes RPG mit JavaFX. Gerade jetzt, einen Text anzuzeigen, habe ich diese bekam:JavaFX warte auf Enter

final IntegerProperty i = new SimpleIntegerProperty(0); 
      Timeline timeline = new Timeline(); 
      KeyFrame keyFrame = new KeyFrame(
        Duration.millis(70), 
        event -> { 
         if (i.get() > info.getText().length()) { 
          timeline.stop(); 
         } else { 
          text.setText(info.getText().substring(0, i.get())); 
          i.set(i.get() + 1); 
         } 
        }); 
      timeline.getKeyFrames().add(keyFrame); 
      timeline.setCycleCount(Animation.INDEFINITE); 
      timeline.play(); 
      timeline.setOnFinished(a -> { 
       hb_start.getChildren().clear(); 
       hb_start.getChildren().addAll(start_left,start_right); 
       hb_start.setAlignment(Pos.CENTER); 
      }); 

Da die Länge der Animation auf der Größe des Textes abhängt, wird die Cyclecount auf unbestimmte gesetzt. Wenn ich nicht vermisse, dass die Animation einmal abgespielt wird und dann aufhört, würde ich es gerne haben, wenn du die Enter-Taste drückst (oder eine andere Taste, für die ich mich später entscheide), um timeline.stop(); zu rufen. Finde heraus, wie du jede Art von Listener hinzufügen kannst. Der Versuch, keyListener zu implementieren scheint mit allen möglichen Sachen zu kommen, die ich nicht brauche, und es funktioniert auch nicht mit einer TextField, und stattdessen will eine JTextField, die in Ordnung sein könnte, außer dass ich keine Ahnung habe wie man alles mit Swing macht.

Momentan wird der Text in einer TextFlow aus dem Text angezeigt. Ich nehme an, der Hörer würde zu der TextFlow oder sogar der Szene selbst hinzugefügt werden, ehrlich gesagt bin ich ratlos, was zu tun ist. Es klingt einfach, aber ich kann es nicht herausfinden.

Antwort

0

KeyListener ist eine AWT-Klasse, keine JavaFX-Klasse. Sofern Sie keine Swing-Komponente in Ihrer JavaFX-Anwendung oder keinen JavaFX-Knoten in einer Swing-Anwendung einbetten, sollten Sie stattdessen das entsprechende Äquivalent von von JavaFX verwenden. Außerdem müssen Sie keine TextField (oder Swing's JTextField) in Ihre Anwendung aufnehmen, nur um wichtige Ereignisse zu erhalten. Sie könnten den Hörer direkt an den Scene hinzufügen:

final KeyCode stopKey = KeyCode.ENTER; 
EventHandler<KeyEvent> handler = event -> { 
    if (event.getCode() == stopKey) { 
     timeline.stop(); 
    } 
}; 
scene.setOnKeyPressed(handler); 

Beachten Sie, dass Ereignisse, die von Knoten verbraucht werden können, bevor sie die Szene erreichen, z.B. von einem TextField, der den Fokus hat. In diesem Fall könnten Sie sicherstellen, dass Sie das Ereignis durch Registrierung eines Listeners als Ereignisfilter erhalten:

// scene.setOnKeyPressed(handler); 
scene.addEventFilter(KeyEvent.KEY_PRESSED, handler);