Java FX обновляет одно текстовое поле на основе другого значения текстового поля

#java #javafx

#java #javafx

Вопрос:

Я новичок в JAVA FX, я хочу «в реальном времени» обновить одно текстовое поле на основе другого значения текстового поля.

Это мой фрагмент кода:

 @FXML
private void initialize() {
tf_code.textProperty().addListener((observable, oldValue, newValue) -> {
        System.out.println(newValue.substring(2, 6));
        tf_newCode.setText(newValue.substring(2, 6));
    });

  }
  

Должен ли я добавить другого прослушивателя ко второму текстовому полю?

Комментарии:

1. Нет, зачем вам это? (Если только вы не указали что-то о желаемом поведении в вопросе.) Вам нужно только добавить прослушиватель к полю, на котором вы хотите основывать изменения другого поля. Однако вам нужно обработать строки длиной менее 6 символов. Это то, с чем у вас возникли проблемы, т. Е. видите ли вы исключения в консоли с Caused by IndexOutOfBoundsException как часть трассировки стека?

2. Пожалуйста, предоставьте больше информации о вашей проблеме, этот фрагмент выглядит так, как будто он должен работать, вы получаете какое-то исключение или поле просто не обновляется?

3. Привет, поле @ Filip просто не обновляется

Ответ №1:

У меня работает. Обратите внимание, что приведенный ниже код не требует .fxml файла. Возможно, вызов метода substring() в опубликованном вами коде выдает сообщение, о Exception котором вы не знаете, потому что вы перехватываете его в пустом catch блоке? Конечно, я только предполагаю, поскольку вы опубликовали только часть своего кода.

 import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class JfxTst00 extends Application {
    public void start(Stage mainStage) throws Exception {
        mainStage.setTitle("JfxTst00");
        BorderPane root = new BorderPane();
        TextField tf_NewCode = new TextField();
        TextField tf_Code = new TextField();
        tf_Code.textProperty().addListener((observable, oldVal, newVal) -> tf_NewCode.setText(newVal));
        root.setTop(tf_Code);
        root.setBottom(tf_NewCode);
        Scene scene = new Scene(root, 220, 70);
        mainStage.setScene(scene);
        mainStage.show();
    }

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

Ответ №2:

Ваши вопросы на самом деле не объясняют проблему, с которой вы столкнулись, хотя я вижу несколько, которые у вас должны возникнуть.

Прежде всего, для первого вам нужен только один прослушиватель TextField , потому что именно за ним мы наблюдаем за изменениями.

Затем вам необходимо учитывать ввод в TextField , который меньше 2 символов и больше 6. Поскольку вы установили жесткие ограничения в своем subString(2, 6) вызове, мы хотим, чтобы наш слушатель работал только в рамках этих ограничений.

Вот простое текстовое приложение, которое демонстрирует:

 import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TextFieldBinding extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        TextField txt1 = new TextField();
        TextField txt2 = new TextField();

        txt1.textProperty().addListener((observable, oldValue, newValue) -> {

            // First, only update txt2 if the new value entered in txt1 is greater than 2, otherwise
            // our substring() method will throw an exception
            if (newValue.length() > 2) {

                // We also need to prevent trying to get a substring that exceeds the remaining length
                // of the txt1 input
                int maxIndex;
                if (newValue.length() < 6) {
                    maxIndex = newValue.length();
                } else {
                    maxIndex = 6;
                }

                // Now set the text for txt2
                txt2.setText(newValue.substring(2, maxIndex));
            }
        });

        root.getChildren().addAll(txt1, txt2);

        // Show the Stage
        primaryStage.setWidth(300);
        primaryStage.setHeight(300);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}