在2个类之间传递全局ObservableList

时间:2015-01-25 15:06:04

标签: java javafx

我有一个问题。如何在两个类之间传递一个ObservableList的相同引用?我需要将我的SimultanTestController中的Element添加到FXMLDocumentController中的List。

我的代码(FXMLDocumentController):

public class FXMLDocumentController implements Initializable {   

    Stage primaryStage = new Stage();
    Stage options = new Stage();
    Stage selectTest = new Stage();

    ObservableList<DefaultTestInterface> items = FXCollections.observableArrayList();

        public ObservableList<DefaultTestInterface> getList() {
        return items;
        }

    @FXML
    private ListView ItemList;
    @FXML
    public Button btn_globalOptions;
    @FXML
    private Button btn_add;
    @FXML
    private Button btn_delete;
    @FXML
    private Button btn_moveUP;
    @FXML
    private Button btn_moveDOWN;

    public void getPrimaryStage(Stage stage){
        this.primaryStage=stage;
    }

我的代码(SimultanTestController):

public class SimultanTestController implements Initializable {

ObservableList<DefaultTestInterface> items = (new FXMLDocumentController()).getList();

@FXML
Button btn_ok;

    public void addTest(ActionEvent event){
           for( int x = 0 ; x < items.size() ; x++ ) { // start from index 0
        System.out.println("Item" +items.get(x));
           }
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
       btn_ok.setOnAction(this::addTest);
    }
}

所以你看,我有一个方法:getList

并且在SimultanTestController中调用此方法,并尝试将getList的值解析为SimultanTestController中的ObservableList。 之后,我想从SimultanTestController向FXMLDocumentController中的ObservableList添加一个元素。但我在两个班级都没有相同的名单...

谢谢你的帮助!

我在这个类中加载我的FXML文件: 首先,我为我的FXML文件创建所有新阶段,并有3个带有FXML文件名的ObservableList,窗口标题和所有阶段。然后我用for-loop加载所有阶段。 (顺便说一句,这是一个很好的解决方案吗?)

我的窗口开启方式:主要 - &gt; SelectTest - &gt; SimultanTest

public class SelectTestController实现Initializable {

ObservableList<String> items =FXCollections.observableArrayList();

Stage primaryStage = new Stage();
Stage simultan = new Stage();
Stage audioLoop = new Stage();
Stage cpu = new Stage();
Stage driversCD = new Stage();
Stage driversHD = new Stage();
Stage driversFD = new Stage();
Stage externalProgramm = new Stage();
Stage graphics = new Stage();
Stage interactive = new Stage();
Stage mainboard = new Stage();
Stage memorySPD = new Stage();
Stage memory = new Stage();
Stage network = new Stage();
Stage ports = new Stage();
Stage reboot = new Stage();
Stage signal = new Stage();
Stage userMessage = new Stage();

@FXML
private ListView lv_selectTest;
@FXML
private Button btn_choose;
@FXML
private Label test;

public void getPrimaryStage(Stage stage){
    this.primaryStage=stage;
}

ObservableList<Stage> stages =FXCollections.observableArrayList();
ObservableList<String> fxml =FXCollections.observableArrayList();
ObservableList<String> stageTitel =FXCollections.observableArrayList();

public void initWindows(){
    try {
        for(int i=0;i<=stages.size();i++){
        Window parent = primaryStage;
        Parent root = FXMLLoader.load(getClass().getResource(fxml.get(i)));
        Scene scene = new Scene(root);
        stages.get(i).initOwner(parent);
        stages.get(i).initModality(Modality.APPLICATION_MODAL);
        stages.get(i).setTitle(stageTitel.get(i));
        stages.get(i).setScene(scene);
        stages.get(i).setResizable(false);
        stages.get(i).setAlwaysOnTop(true);
        }
    }catch (IOException|IllegalStateException ex) {
        System.out.println(ex);
    }
}

我试图获得FXML-Loader的控制器,这是有效的。我从JavaFX-Start方法获取值并将其解析为FXMLDocumentController。现在我在FXMLDocumentConroller中有一个带有控制器实例的var。但我无法在SimultanTest中获取值,或者向ObservableList项添加内容。我厌倦了新的Instance()和setter + getter ......我不知道为什么我不明白......

如果有人能根据我的代码给我一个例子,那将是非常好的...你看我为我的解决方案工作但我没有进一步......

1 个答案:

答案 0 :(得分:1)

我为我的问题找到了一个自己的解决方案。我没有得到FXMLMain的控制器,但我用一个存储ObservableList项的Singelton类解决了它。

现在我可以设置每个类的Items,并可以在FXMLDocumentController的ListView中显示它们。如果某人有同样的问题,请联系我寻求解决方案。

感谢您帮助@ James_D