2017-11-19 18 views
0

기본적으로 JavaFX를 사용하는 텍스트 기반 RPG와 비슷합니다. 지금, 일부 텍스트를 표시하는 데,이있어 : 애니메이션의 길이가 텍스트의 크기에 따라 달라집니다JavaFX 입력 대기

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

때문에, cyclecount이 무기한으로 설정됩니다. 내가 애니메이션을 한 번 재생 한 다음 멈추게하지 않는 다른 방법이 없다면 enter (또는 나중에 결정할 다른 키)를 호출하여 timeline.stop();을 호출 할 수 있지만, 어떤 종류의 청취자를 추가하는 방법을 알아 내야합니다. keyListener을 구현하려고하면 내가 필요로하지 않는 모든 종류의 물건이있는 것으로 보이며 TextField과 작동하지 않으며 대신 JTextField을 원합니다. 단서가 없다는 점만 제외하면 괜찮습니다. Swing으로 무엇을 할 수있는 방법.

현재 텍스트는 Text의 텍스트 TextFlow에 표시되고 있습니다. 청취자가 TextFlow에 추가되거나 심지어 장면 자체에 추가 될 것이라고 가정합니다. 솔직히, 나는 무엇을 해야할지에 대한 상실감이 있습니다. 그것은 간단하게 들리지만, 나는 그것을 이해하는 것처럼 보일 수 없다.

답변

0

KeyListener은 JavaFX 클래스가 아닌 AWT 클래스입니다. JavaFX 응용 프로그램 또는 Swing 응용 프로그램의 JavaFX 노드에 Swing 구성 요소를 포함하지 않는 한 JavaFX의 해당 EventHandler<KeyEvent>을 대신 사용해야합니다. 또한 키 이벤트를 받기 위해 응용 프로그램에 TextField (또는 Swing의 JTextField)을 포함 할 필요가 없습니다. 당신은 Scene에 직접 리스너를 추가 할 수 있습니다 : 그들은 현장에 도달하기 전에 이벤트가 노드에 의해 소비 될 수

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

참고, 예를 포커스가있는 TextField. 이 경우 리스너를 이벤트 필터로 등록하여 이벤트를 수신 할 수 있습니다.

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