我有这个简单的控制器:
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文件..我该如何解决这个问题呢?
答案 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上执行。