3

私はjavafxアプリを作成しています。重いプログラミング (重いマッピング) を使用します。ユーザーエクスペリエンスが遅くなるため、マルチスレッド化する必要があります。
可能であれば、コード全体を書き直したくありません。しかし、それは必要ではありません。ライフサイクル、スレッドの制御方法、スレッドに何かを依頼する方法を完全に説明してくれる人が必要です。
たとえば、fxml コントローラーでマッピング文字の完全なリストを提供します。

@FXML
private static final Map <Character, String> myMap = new HashMap <> ();
static {
    myMap.put('a', "5");
    myMap.put('b', "6");
    myMap.put('c', "7");
    myMap.put('d', "8");
    //And so on...
}

次に、ボタンを押したときに入力テキストをエンコードします。

    String codedTextOut;                
    textToCode = enteredText.getText();
    StringBuilder encoderTextSB = new StringBuilder();
    for (char codeChar : textToCode.toCharArray()) {
        encoderTextSB.append(myMap.get(codeChar));
    }
    codedTextOut = encoderTextSB.toString();

これにより、ユーザー エクスペリエンスが遅くなります。ボタンを押したときにエンコード アクションを実行する別のスレッドを作成したいと考えています。スレッドのさまざまなプロパティを助けて説明してください。( http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htmをチェックアウトしましたが、あまり有益ではありません)

4

1 に答える 1

2
  1. 事前定義されたスレッドのプールまたは new Thread() を使用して、実行可能なデータを提供します。

計算をjavafxスレッドから別のスレッドに移動するため、ユーザーはアプリケーションとの対話を続けることができます。

  1. 結果の準備が整ったら、runLater() を使用します。この呼び出しは javafx キューで実行されるため、同時実行の問題が発生することはありません。

これにより、評価の結果を UI に返すことができます。(別のスレッドから UI コンポーネントを操作しないでください)。

オプションとして、Task などの javafx 並行パッケージの別の機能を使用します。

コード スニペットは次のとおりです。

@Override
public void start(Stage primaryStage) {
    final TextArea ta = new TextArea();
    ta.setMinSize(100, 100);
    Button btn = new Button();
    btn.setText("Encode'");
    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {

            ta.setDisable(true);
            new Thread(new Runnable() {

                @Override
                public void run() {
                    final StringBuilder codedTextOut = new StringBuilder();
                    String textToCode = ta.getText();
                    StringBuilder encoderTextSB = new StringBuilder();
                    for (char codeChar : textToCode.toCharArray()) {
                        encoderTextSB.append(codeChar + 15);
                    }
                    codedTextOut.append(encoderTextSB);
                    Platform.runLater(new Runnable() {

                        @Override
                        public void run() {
                            ta.setText(codedTextOut.toString());
                            ta.setDisable(false);
                        }
                    });
                }
            }).start();
        }
    });

    VBox root = new VBox();
    root.getChildren().addAll(ta, btn);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("Encoder");
    primaryStage.setScene(scene);
    primaryStage.show();
}

ボタンをクリックすると、テキスト領域を無効にし、新しいスレッドを作成し、その中でコードを実行します。その後、実行可能ファイルを javafx キューに配置し、JavaFX スレッドで 2 番目の実行可能ファイルからコードを実行します。ここで、新しいテキストを割り当てて有効にします。テキストエリアバック。

于 2013-06-02T10:57:36.640 に答える