有没有一种方法可以在JavaFX中对场景进行简单的刷新
更新:根据@kleopatra评论 关闭包含有没有一种方法可以在JavaFX中对场景进行简单的刷新,java,javafx,Java,Javafx,更新:根据@kleopatra评论 关闭包含文本字段的窗口时,我想从另一个控制器的文本字段中的字符串设置按钮的文本 public class Controller { @FXML Button btn1; public void initialize(){ renderBtns(); } public void renderBtns(){ btn1.addEventHandler(MouseEvent.MOUSE_CLICK
文本字段的窗口时,我想从另一个控制器的文本字段中的字符串设置按钮的文本
public class Controller {
@FXML Button btn1;
public void initialize(){
renderBtns();
}
public void renderBtns(){
btn1.addEventHandler(MouseEvent.MOUSE_CLICKED, new CustomButtonHandler(1));
}
}
我正在为按钮
鼠标单击事件使用自定义处理程序。(请记住,这是我代码的简化版本,我需要在完整代码中使用此处理程序)
这是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();
}
}
}
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 -> {
controller.exitScene();
});
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>
当我关闭窗口时,我在控制台中获得了正确的值(来自btn1.getText()),但按钮保持不变
为什么它在控制台中给了我正确的值,但图形没有改变
如何正确执行此操作?结果表明,我的问题不是刷新屏幕,而是创建了控制器的新实例,因此在运行时没有显示更改。(当我在exitScene()
中运行stage.show()
时,显示了新实例)
如果我在应用程序
类中创建一个控制器实例,然后通过该类调用它,它将按照我的需要工作
像这样:
主要内容:
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();
}
}
}
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 -> {
controller.exitScene();
});
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() {
Main.controller.btn1.setText(txtField.getText());
}
}
控制器:
public class Controller {
@FXML Button btn1;
public void initialize(){
renderBtns();
}
public void renderBtns(){
btn1.addEventHandler(MouseEvent.MOUSE_CLICKED, new CustomButtonHandler(1));
}
public void clickBtn(){
}
}
请..好的初学者:)仍然缺少:fxml文件和应用程序顺便说一句:您知道您在exitScene中创建了一个新控制器(与处理程序按钮所在的控制器无关),并且不在任何地方使用它?@kleopatra我实际上没有意识到我创建了一个新控制器。。。我应该如何引用现有的而不是创建新的?我以为getController()给了我现有的我以为getController()给了我现有的你的假设是错误的;)
public class Controller {
@FXML Button btn1;
public void initialize(){
renderBtns();
}
public void renderBtns(){
btn1.addEventHandler(MouseEvent.MOUSE_CLICKED, new CustomButtonHandler(1));
}
public void clickBtn(){
}
}