Обновлять: В соответствии с комментарием @kleopatra.
Я хочу установить текст Button
из String
в TextField
из другого контроллера после закрытия окна, содержащего TextField
.
public class Controller {
@FXML Button btn1;
public void initialize(){
renderBtns();
}
public void renderBtns(){
btn1.addEventHandler(MouseEvent.MOUSE_CLICKED, new CustomButtonHandler(1));
}
}
Я использую специальный обработчик для события Button
MOUSE_CLICKED. (Имейте в виду, что это упрощенная версия моего кода, мне нужно использовать этот обработчик в полном коде)
Вот CustomButtonHandler:
public class CustomButtonHandler implements EventHandler {
int id;
public CustomButtonHandler(int id){
this.id = id;
}
@Override
public void handle(Event event) {
try {
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("smetka.fxml"));
Parent root = fxmlLoader.load();
SmetkaControl controller = fxmlLoader.getController();
controller.setId(id);
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setTitle("Сметка - Маса" + " " + id);
stage.setScene(scene);
stage.initModality(Modality.APPLICATION_MODAL);
stage.setOnHiding(event1 -> {
try {
controller.exitScene();
} catch (IOException | ParseException e) {
e.printStackTrace();
}
});
stage.show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Вот мой другой - SmetkaControl
:
public class SmetkaControl {
int id;
@FXML
TextField txtField;
public void setId(int id) {
this.id = id;
}
public void initialize() {
}
public void exitScene() throws IOException, ParseException {
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("sample.fxml"));
fxmlLoader.load();
Controller controller = fxmlLoader.getController();
txtField.setFocusTraversable(false);
controller.btn1.setText(txtField.getText());
System.out.println(controller.btn1.getText());
}
}
sample.fxml:
<?xml version = "1.0" encoding = "UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity" minWidth = "-Infinity" prefHeight = "400.0" prefWidth = "600.0" xmlns = "http://javafx.com/javafx/15.0.1" xmlns:fx = "http://javafx.com/fxml/1" fx:controller = "sample.Controller">
<center>
<Button fx:id = "btn1" mnemonicParsing = "false" text = "Button" BorderPane.alignment = "CENTER" />
</center>
</BorderPane>
и smetka.fxml:
<?xml version = "1.0" encoding = "UTF-8"?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<HBox alignment = "CENTER" maxHeight = "-Infinity" maxWidth = "-Infinity" minHeight = "-Infinity" minWidth = "-Infinity" prefHeight = "600.0" prefWidth = "950.0" xmlns = "http://javafx.com/javafx/15.0.1" xmlns:fx = "http://javafx.com/fxml/1" fx:controller = "sample.SmetkaControl">
<children>
<TextField fx:id = "txtField" />
</children>
</HBox>
По умолчанию используется Main.class:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 600, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Когда я закрываю окно, я получаю правильное значение в консоли (из btn1.getText ()), но кнопка остается неизменной.
Почему в консоли отображается правильное значение, но изображение не изменилось?
Как мне это сделать правильно?
хороший стартер :) Еще не хватает: файлов fxml и приложения
btw: вы знаете, что вы создаете новый контроллер в exitScene (который не имеет ничего общего с тем, на котором находится кнопка с обработчиком) и нигде его не используете?
@kleopatra На самом деле я не знал, что создаю новый контроллер ... Как мне ссылаться на существующий, а не создавать новый? Я думал, что getController () дает мне существующий
забыл ссылки на варианты решения: см. f.i. stackoverflow.com/questions/14187963/… или stackoverflow.com/questions/32342864/applying-mvc-with-javaf x
@kleopatra Вы правы, когда я запустил stage.show () в exitScene (), он показал новый контроллер и новую сцену с правильными значениями. Я проработаю это и отправлю в качестве ответа позже