我正在研究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在调用 initialize 时没有改变,当我第一次在对象 e 上调用createView方法并传递乘以的值时PANE_HEIGHT变量?感谢。
答案 0 :(得分:0)
当您致电EventView
时,您可能无法重复使用相同的e
实例(initialize()
)。只有您用来调用EventView
的{{1}}实例才具有createView()
的预期值。
答案 1 :(得分:0)
使用' FXMLLoader'时,您可以创建新控制器。要使用已创建的方法,您必须在加载fxml文件之前使用FXMLLoader
的{{3}}方法,以使用您自己创建的控制器实例:
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("eventView.fxml"));
Parent root = null;
fxmlLoader.setController(this);
try {
root = fxmlLoader.load();