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