Как вы выполняете одно действие через несколько обработчиков событий в Java FX? - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь сделать форму, которая делает квадратную формулу. Он работает в командной строке, но я хочу, чтобы он работал в форме и обновлял вывод каждый раз, когда вы меняете ввод. Пока это моя форма. Существует несколько областей, которые вы можете изменить, а именно поле со списком и текстовые поля, но я хочу, чтобы все они обновляли метки для отображения вывода. Вот где моя проблема. Я не знаю, как сделать что-то похожее на метод, который обновляет метки. Упрощенная версия кода приведена ниже:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class SmallForm extends Application{

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        GridPane grid = new GridPane();
        grid.setVgap(5);

        Label lblConcatenated = new Label("");//label that will hold the concatenated string
        grid.add(lblConcatenated, 0, 0);

        TextField txtA = new TextField("");//Text field one
        grid.add(txtA, 0, 1);

        TextField txtB = new TextField("");//Text field two
        grid.add(txtB, 0, 2);

        txtA.textProperty().addListener(new ChangeListener<String>() { //Triggers whenever the second text field is changed
            @Override public void changed(ObservableValue ov, String t, String t1) {
               lblConcatenated.setText(txtA.getText() + txtB.getText());//Concatenates the text in the two text fields
            }
        });

        txtB.textProperty().addListener(new ChangeListener<String>() {
            @Override public void changed(ObservableValue ov, String t, String t1) { //Triggers whenever the second text field is changed
                lblConcatenated.setText(txtA.getText() + txtB.getText());//Concatenates the text in the two text fields
            }
        });

        Scene scene = new Scene(grid, 250, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

Моя цель состоит в том, чтобы строка конкатенации была написана только один раз. Это было бы намного более распространенным с большим количеством повторяющегося кода. В командной строке это было бы легко сделать с помощью метода, но это не работает в java fx, насколько мне известно. Я слышал термин «нить», используемый для этого, но я не мог понять это.

Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Конечно, вы можете использовать методы. Вы также можете использовать один и тот же объект ChangeListener<String> для обоих свойств.

В этом случае, однако, я рекомендую использовать привязку:

lblConcatenated.textProperty().bind(txtA.textProperty().concat(txtB.textProperty()));

Если вам нужно проанализировать значения и выполнить обновления на основе проанализированных значений, я рекомендую использовать TextFormatter:

StringConverter<Double> converter = new DoubleStringConverter();
TextFormatter<Double> formatterA = new TextFormatter<>(converter, 0d);
TextFormatter<Double> formatterB = new TextFormatter<>(converter, 0d);
txtA.setTextFormatter(formatterA);
txtB.setTextFormatter(formatterB);

formatterA.valueProperty()...

Значения форматера обновляются, когда TextField теряет фокус или вы запускаете событие onAction TextField.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...