覆盖方法初始化在调用时无法识别变量值更改
Overriden method initialize does not recognize variable value change when called
我正在处理 MVC 项目并遇到以下问题:
在名为 CentralLayout 的视图中是以下代码:
EventView e = new EventView();
gridSchedule.add(e.createView(5), 1, 1, 1, 5);
其中 createView 方法在以下接口中定义:
public interface Creatable {
public Node createView();
public Node createView(int eventDuration);
}
EventView 实现为:
public class EventView extends BaseViewController implements Initializable, Creatable {
private int PANE_HEIGHT = 10;
final int PANE_WIDTH = 99;
@FXML
private Label lblObjectOne;
@FXML
private Label lblObjectTwo;
@FXML
private Pane eventPane;
@Override
public Node createView() {
return null;
}
@Override
public Node createView(int eventDuration) {
PANE_HEIGHT = eventDuration * 20;
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("eventView.fxml"));
Parent root = null;
try {
root = fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
return root;
}
@Override
public void initialize(URL location, ResourceBundle resources) {
System.out.println(PANE_HEIGHT);
eventPane.setMaxHeight(PANE_HEIGHT);
eventPane.setMaxWidth(PANE_WIDTH);
lblObjectOne.setText("test");
lblObjectTwo.setText("test");
}
}
注意:我在 SceneBuilder 中创建了 eventPane,其属性在 eventView.fxml 文件中定义。
问题是 eventPane 的最终绘制高度等于 10,而不是 100。在控制台中,值 10 打印为 PANE_HEIGHT 值。
谁能告诉我,当我第一次调用对象 上的 createView 方法时,为什么 PANE_HEIGHT 在调用 initialize 时没有改变e 并传递乘以 PANE_HEIGHT 变量的值?谢谢
调用 initialize()
时,您可能没有重复使用同一个 EventView
实例 (e
)。只有您用来调用 createView()
的 EventView
实例才会具有 PANE_HEIGHT
.
的预期值
您在使用 'FXMLLoader' 时创建了一个 new 控制器。要使用已经创建的控制器实例,您必须在加载 fxml 文件之前使用 FXMLLoader
的 setController
方法以使用您自己创建的控制器实例:
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("eventView.fxml"));
Parent root = null;
fxmlLoader.setController(this);
try {
root = fxmlLoader.load();
我正在处理 MVC 项目并遇到以下问题:
在名为 CentralLayout 的视图中是以下代码:
EventView e = new EventView();
gridSchedule.add(e.createView(5), 1, 1, 1, 5);
其中 createView 方法在以下接口中定义:
public interface Creatable {
public Node createView();
public Node createView(int eventDuration);
}
EventView 实现为:
public class EventView extends BaseViewController implements Initializable, Creatable {
private int PANE_HEIGHT = 10;
final int PANE_WIDTH = 99;
@FXML
private Label lblObjectOne;
@FXML
private Label lblObjectTwo;
@FXML
private Pane eventPane;
@Override
public Node createView() {
return null;
}
@Override
public Node createView(int eventDuration) {
PANE_HEIGHT = eventDuration * 20;
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("eventView.fxml"));
Parent root = null;
try {
root = fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
return root;
}
@Override
public void initialize(URL location, ResourceBundle resources) {
System.out.println(PANE_HEIGHT);
eventPane.setMaxHeight(PANE_HEIGHT);
eventPane.setMaxWidth(PANE_WIDTH);
lblObjectOne.setText("test");
lblObjectTwo.setText("test");
}
}
注意:我在 SceneBuilder 中创建了 eventPane,其属性在 eventView.fxml 文件中定义。
问题是 eventPane 的最终绘制高度等于 10,而不是 100。在控制台中,值 10 打印为 PANE_HEIGHT 值。
谁能告诉我,当我第一次调用对象 上的 createView 方法时,为什么 PANE_HEIGHT 在调用 initialize 时没有改变e 并传递乘以 PANE_HEIGHT 变量的值?谢谢
调用 initialize()
时,您可能没有重复使用同一个 EventView
实例 (e
)。只有您用来调用 createView()
的 EventView
实例才会具有 PANE_HEIGHT
.
您在使用 'FXMLLoader' 时创建了一个 new 控制器。要使用已经创建的控制器实例,您必须在加载 fxml 文件之前使用 FXMLLoader
的 setController
方法以使用您自己创建的控制器实例:
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("eventView.fxml"));
Parent root = null;
fxmlLoader.setController(this);
try {
root = fxmlLoader.load();