2016-03-29 9 views
1

現在JavaFxを学習しようとしていますが、今は問題に取り組んでいます。スキャナを使用することで、ラベルをステージ上で連続的に更新したいと考えています。scanner、inJavaFxを使用して連続してラベルを更新します

私はplatform.runLaterを使用しようとしましたが、これは1つの更新を示しています。私は自分のコンソールに何か新しいものを書き込むたびにラベルを更新しません。

  Platform.runLater(new Runnable() { 
       @Override 
       public void run() { 
        label.setText(sc.nextLine()); 
       } 
      }); 
+0

'nextLine()'はブロッキングメソッドです:FXアプリケーションスレッドで呼び出さないでください。 。これを行うには、バックグラウンドスレッドを使用する必要があります。 –

答えて

0

あなたがこれを行うことができますいくつかの方法があります。

これは私が使用しているものです。 1つの方法は、テキストを観察可能なプロパティに読み込み、そのプロパティが変更されたときにラベルを更新することです。これを行うために使用できるオブジェクトの1つはSimpleStringPropertyです。

このようにそれを宣言します。あなたはあなたのスキャナからの入力を読み込むときに、値を変更

someText.addListener((observable, oldValue, newValue) -> { 
    Platform.runLater(() -> { 
     label.setText(newValue); 
    }); 
}); 

:コンストラクタまたはいくつかの初期化機能で

private StringProperty someText = new SimpleStringProperty(); 

、プロパティに新しいChangeListenerを追加あなたの観察可能なラベルとリスナーが呼び出され、ラベルのテキストが変更されます。

+0

お返事ありがとうございます。しかし、私はまだ同じ問題を解決しています。ラベルは一度しか更新できません。私は "someText.set(sc.nextLine());"ユーザーからの入力があってもプログラムがクラッシュしている間は、それを実行するWhileに移ります。 – flirmino

2

ScannernextLine()メソッドはブロッキングコールです.FXアプリケーションスレッドを決してブロックしないでください。

import java.util.Scanner; 

import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class UpdateLabelFromScanner extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Label label = new Label(); 

     Thread scannerReadThread = new Thread(() -> { 
      try (Scanner scanner = new Scanner(System.in)) { 
       while (scanner.hasNextLine()) { 
        String line = scanner.nextLine() ; 
        Platform.runLater(() -> label.setText(line)); 
       } 
      } catch (Exception exc) { 
       exc.printStackTrace(); 
      } 
     }); 

     scannerReadThread.setDaemon(true); 
     scannerReadThread.start(); 

     StackPane root = new StackPane(label); 
     primaryStage.setScene(new Scene(root, 180, 120)); 
     primaryStage.show(); 
    } 

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

ありがとう!これは完全に機能しました。 – flirmino

関連する問題