2015-08-24 45 views
1

我工作的一个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变量的值?谢谢。

回答

0

当您使用'FXMLLoader'时,您将创建一个新的控制器。要使用一个已经创建的,你必须使用FXMLLoadersetController方法加载FXML文件之前,使用你自己创建一个控制器实例:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("eventView.fxml")); 
Parent root = null; 
fxmlLoader.setController(this); 
try { 
    root = fxmlLoader.load(); 
+0

哇,这是快。谢谢你的伴侣!另外我需要确保.fxml文件没有设置fx:controller,因为我遇到了“Controller value already already specified”。 – hideburn

0

当您拨打initialize()时,您可能不会重复使用相同的EventView实例(e)。只有您用于呼叫createView()EventView实例的预期值为PANE_HEIGHT