覆盖方法初始化不能识别变量值变化时调用
问题描述:
我工作的一个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值。
谁能告诉我,为什么PANE_HEIGHT当初始化被称为没有改变,当我第一次拜访对象Ë的的CreateView的方法,并通过了成倍PANE_HEIGHT变量的值?谢谢。
答
当您使用'FXMLLoader'时,您将创建一个新的控制器。要使用一个已经创建的,你必须使用FXMLLoader
的setController
方法加载FXML文件之前,使用你自己创建一个控制器实例:
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("eventView.fxml"));
Parent root = null;
fxmlLoader.setController(this);
try {
root = fxmlLoader.load();
答
当您拨打initialize()
时,您可能不会重复使用相同的EventView
实例(e
)。只有您用于呼叫createView()
的EventView
实例的预期值为PANE_HEIGHT
。
哇,这是快。谢谢你的伴侣!另外我需要确保.fxml文件没有设置fx:controller,因为我遇到了“Controller value already already specified”。 – hideburn