JavaFX:无法从anoher类调用Controller函数

时间:2016-02-11 11:14:59

标签: function class javafx controller

我有这个简单的控制器:

var checkboxElement = element.all(by.css('LOCATOR_FOR_ALL_CHECKBOXES')); //provide a universal locator for all checkbox and not sub locator to table cell
checkboxElement.filter(function(eachCell){
    return eachCell.checkboxElement.isSelected().then(function(selected){
        return selected;
    });
}).count().then(function(count){
    console.log(count); //returns count of elements that are checked
});

这是我的主要内容:

@FXML
private VBox VVbox;

private ButtonBar newNode = new ButtonBar();
private Circle c= new Circle();
private Button b= new Button();
private Label lname = new Label();
private Label lIMEI = new Label();
private Label lroot = new Label();


@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub

}

public void create(String imei){
    System.out.println(imei);
    newNode = new ButtonBar();
    b = setButtonSpec(imei + "btnHavefun");
    c = setCircleSpec(imei + "statuOnline");
    lname= setLNameSpec(imei + "name");
    lIMEI = setLIMEISpec(imei + "Imei");
    lroot = setLrootSpec(imei + "root");
    newNode.getButtons().addAll(lname,lIMEI,lroot,b,c);
    VVbox.getChildren().addAll(newNode) ;
}

正如你在main中看到的那样,我开始一个新的线程,我想要一个Controller函数。

@Override
public void start(Stage primaryStage) {
    this.primaryStage = primaryStage;
    this.primaryStage.setTitle("Thypheon Application");
    Connection connessione = new Connection();
    Thread t = new Thread(connessione);
    initDesign();
    t.start();
}


public static void main(String[] args) {
    launch(args);
}

public void initDesign(){
    try {
        loader2= new FXMLLoader(getClass().getResource("Design.fxml"));
        AnchorPane anchor  = (AnchorPane) loader2.load();
        rootLayout.setCenter(anchor);
        controller = loader2.getController();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

在执行最后一行之前,所有内容似乎都在create function中:VVbox.getChildren()。addAll(newNode); 可能是因为它引用了FXML文件..我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

是的,你是对的。您自己实例化的控制器不会通过FXML注入其字段。要获得对控制器的引用,以下是可能的解决方案:

public Controller initDesign(){
    // some FXML loading code
    return controller;
}

然后,您需要修改Connection以在构造函数中获取Controller对象:

class Connection ... {
   Controller contoller;
   public Connection(Controller controller) {
       this.controller = controller;
   }
}

最后在start()你需要:

Controller controller = initDesign();
Connection connessione = new Connection(controller);
Thread t = new Thread(connessione);
t.start();

但是,您的设计存在多个问题。 您的Connection实例未在JavaFX Application Thread上运行。因此,任何从不同线程修改场景图的尝试(例如您对VVbox.getChildren().addAll(newNode);的调用)都会导致错误。

从JavaFX Thread调用start()方法。无需创建新线程。我不确定是否有意图,但你可以从create()中的Controller致电start(),以便在JavaFX Thread上执行。