fx:id 参考控制
Reference control by fx:id
我有一个使用 JavaFX 和 Scene Builder 为 class 设计的日历屏幕。
我放置数字的部分是一个标签,而目前显示 "None" 的部分是一个按钮。我想在 select 按钮时引用标签中的值,以便我可以显示当天用户的约会。
有没有办法通过 FX:ID 字符串名称来引用控件,以便我可以这样做?标签名为 lblDayOfTheWeekxx,按钮名为 btnAppointmentxx,其中 xx 是从 01 到 42 的值。
这是我尝试更改值的方法。这只是一个测试,我试图将第一个按钮的值变为 "DONE"。
@FXML
void handleDayChosen(ActionEvent event) {
try {
// FXMLLoader loader = new FXMLLoader();
// loader.setLocation(getClass().getResource("/Views/FormMain.fxml"));
// Parent myView = loader.load();
// Scene myScene = new Scene(myView);
// Label lbl = (Label) myScene.lookup("#lblDateOfMonth01");
// Label myLblField = (Label)myView.FindControl("txtField" + 1);
// lbl.setText("DONE");
FXMLLoader loader = new FXMLLoader(getClass().getResource("/Views/FormMain.fxml"));
Parent root = loader.load();
Button foo = (Button)loader.getNamespace().get("lblAppointments01");
foo.setText("DONE");
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
我是 Java 的新手,所以我不知道自己做错了什么。
提前致谢,
比尔
这是我终于想到的。我知道这不是 漂亮 但它有效。
GridPane gpCal = this.gpCalendar;
for (int i = 1 ; i <= 7; i++) {
int row = i * 2;
for (int col = 1; col <= 7; col++) {
int pos = ((i-1)*7)+col;
lblDay[pos] = new Label();
lblDay[pos].setText("");
lblDay[pos].setPrefSize(100, 20);
lblDay[pos].setText(String.valueOf(col) + ", " + String.valueOf(row));
gpCal.add(lblDay[pos], col, row);
}
row++;
for (int col = 0; col <= 6; col++) {
int pos = ((i-1)*7)+col;
btnAppts[pos] = new Button();
btnAppts[pos].setText("");
btnAppts[pos].setPrefSize(100, 100);
btnAppts[pos].setText(String.valueOf(col) + ", " + String.valueOf(row));
gpCal.add(btnAppts[pos], col, row);
}
}
现在是格式化按钮和标签以匹配下方内容的简单部分。
感谢您的帮助,
比尔
像这样的 UI 根本不适合 FXML。使用 Java 创建这样的 UI 通常更容易,代码也更少。这样你就可以在循环中创建按钮和标签,并为每个添加不同的事件处理程序:
int numDays = 30 ; // in real life this comes from the month and year
GridPane calendarPane = ...; // can be a @FXML-injected variable if needed
for (int i = 1 ; i <= numDays ; i++) {
Label dayLabel = new Label(Integer.toString(i));
Button button = new Button("None");
// set styles, etc
int day = i ;
button.setOnAction(e -> processButtonPress(button, dayLabel, day));
VBox vbox = new VBox(dayLabel, button);
int row = getRowForDay(i);
int col = getColumnForDay(i);
calendarPane.add(vbox, col, row);
}
// ...
private void handleDayChosen(Button button, Label label, int dayOfMonth) {
// whatever you need here...
label.setTextFill(Color.GREEN);
button.setText("Done");
}
显然,如果需要,您仍然可以对周围的 UI 使用 FXML,只需将上面的循环放在控制器的 initialize()
方法中即可。但这显然比 100 多行 FXML 加上控制器中 60 个不同的变量来实现同样的事情要好。
我有一个使用 JavaFX 和 Scene Builder 为 class 设计的日历屏幕。
我放置数字的部分是一个标签,而目前显示 "None" 的部分是一个按钮。我想在 select 按钮时引用标签中的值,以便我可以显示当天用户的约会。
有没有办法通过 FX:ID 字符串名称来引用控件,以便我可以这样做?标签名为 lblDayOfTheWeekxx,按钮名为 btnAppointmentxx,其中 xx 是从 01 到 42 的值。
这是我尝试更改值的方法。这只是一个测试,我试图将第一个按钮的值变为 "DONE"。
@FXML
void handleDayChosen(ActionEvent event) {
try {
// FXMLLoader loader = new FXMLLoader();
// loader.setLocation(getClass().getResource("/Views/FormMain.fxml"));
// Parent myView = loader.load();
// Scene myScene = new Scene(myView);
// Label lbl = (Label) myScene.lookup("#lblDateOfMonth01");
// Label myLblField = (Label)myView.FindControl("txtField" + 1);
// lbl.setText("DONE");
FXMLLoader loader = new FXMLLoader(getClass().getResource("/Views/FormMain.fxml"));
Parent root = loader.load();
Button foo = (Button)loader.getNamespace().get("lblAppointments01");
foo.setText("DONE");
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
我是 Java 的新手,所以我不知道自己做错了什么。
提前致谢,
比尔
这是我终于想到的。我知道这不是 漂亮 但它有效。
GridPane gpCal = this.gpCalendar;
for (int i = 1 ; i <= 7; i++) {
int row = i * 2;
for (int col = 1; col <= 7; col++) {
int pos = ((i-1)*7)+col;
lblDay[pos] = new Label();
lblDay[pos].setText("");
lblDay[pos].setPrefSize(100, 20);
lblDay[pos].setText(String.valueOf(col) + ", " + String.valueOf(row));
gpCal.add(lblDay[pos], col, row);
}
row++;
for (int col = 0; col <= 6; col++) {
int pos = ((i-1)*7)+col;
btnAppts[pos] = new Button();
btnAppts[pos].setText("");
btnAppts[pos].setPrefSize(100, 100);
btnAppts[pos].setText(String.valueOf(col) + ", " + String.valueOf(row));
gpCal.add(btnAppts[pos], col, row);
}
}
现在是格式化按钮和标签以匹配下方内容的简单部分。
感谢您的帮助,
比尔
UI 根本不适合 FXML。使用 Java 创建这样的 UI 通常更容易,代码也更少。这样你就可以在循环中创建按钮和标签,并为每个添加不同的事件处理程序:
int numDays = 30 ; // in real life this comes from the month and year
GridPane calendarPane = ...; // can be a @FXML-injected variable if needed
for (int i = 1 ; i <= numDays ; i++) {
Label dayLabel = new Label(Integer.toString(i));
Button button = new Button("None");
// set styles, etc
int day = i ;
button.setOnAction(e -> processButtonPress(button, dayLabel, day));
VBox vbox = new VBox(dayLabel, button);
int row = getRowForDay(i);
int col = getColumnForDay(i);
calendarPane.add(vbox, col, row);
}
// ...
private void handleDayChosen(Button button, Label label, int dayOfMonth) {
// whatever you need here...
label.setTextFill(Color.GREEN);
button.setText("Done");
}
显然,如果需要,您仍然可以对周围的 UI 使用 FXML,只需将上面的循环放在控制器的 initialize()
方法中即可。但这显然比 100 多行 FXML 加上控制器中 60 个不同的变量来实现同样的事情要好。