从不同的控制器向舞台添加元素

时间:2015-12-20 08:48:44

标签: javafx controller fxml

我有一个MainInterface.fxml,有自己的控制器MainController,其中一个按钮从NewCrawler.fxml打开一个新的舞台及其关联的控制器AddCrawlerController。  它看起来很好,但我需要使用NewCrawler接口将东西添加到MainInterface中。

每次有人按下NewCrawler中的“开始抓取”按钮时,目标是添加一个新的“itemCrawler”,就像在MainInterface中硬编码的那样。我怎么能这样做?

MainController.java

public class MainController {

    @FXML private AnchorPane mainPane;

    @FXML
    public void addCrawlerInstance(String domain) { //TODO dynamically add itemCrawler (Like the one hardcoded in MainInterface
        Button b = new Button(domain); //it is only a try to add elements from a different controller
        mainPane.getChildren().add(b);
    }

    @FXML
    private void createCrawler () throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("guifxml/NewCrawler.fxml"));
        Scene scene = new Scene(root);
        Stage stage = new Stage();
        stage.setScene(scene);
        stage.show();
    }



}

AddCrawlerController.java

public class AddCrawlerController { //ADD Button from Main Interface
    @FXML private Button abortButton;
    @FXML private Button addCrawlerButton;

    @FXML
    private void abortCurrentWindow () {
        Stage currentStage = (Stage) abortButton.getScene().getWindow();
        currentStage.close();
    }

    @FXML
    private void addNewCrawler () throws Exception { //TODO ref. Maincontroller.AddCrawlerInstance
        FXMLLoader loader = new FXMLLoader(getClass().getResource("guifxml/MainInterface.fxml"));
        Parent root = loader.load();
        String d = "prova";
        MainController controller = loader.getController();
        controller.addCrawlerInstance("prova");
    }
}

MainInterface.fxml

<VBox fx:id="mainApp" maxWidth="600.0" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="wsa.gui.MainController">
  <children>
      <ButtonBar maxWidth="643.0" nodeOrientation="RIGHT_TO_LEFT" prefHeight="40.0" prefWidth="643.0">
        <buttons>
            <Button alignment="CENTER" mnemonicParsing="false" text="Set Path" />
          <Button alignment="CENTER" mnemonicParsing="false" text="Delete" />
            <Button alignment="CENTER" mnemonicParsing="false" text="Stop" />
            <Button alignment="CENTER" mnemonicParsing="false" text="Start" />
            <Button alignment="CENTER" mnemonicParsing="false" onMouseClicked="#createCrawler" text="Add" />
        </buttons>
         <VBox.margin>
            <Insets />
         </VBox.margin>
         <padding>
            <Insets right="5.0" />
         </padding>
      </ButtonBar>
    <AnchorPane fx:id="mainPane" maxHeight="-1.0" maxWidth="-1.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
         <children>
            <Separator layoutY="2.0" prefHeight="3.0" prefWidth="645.0" />
            <Pane fx:id="itemCrawler" prefHeight="52.0" prefWidth="645.0">
               <children>
                  <Text layoutX="44.0" layoutY="34.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Domain">
                     <font>
                        <Font size="20.0" />
                     </font>
                  </Text>
                  <TextField editable="false" layoutX="124.0" layoutY="13.0" prefHeight="25.0" prefWidth="319.0" text="http://www.prova.org" />
                  <Button alignment="CENTER" layoutX="456.0" layoutY="13.0" mnemonicParsing="false" text="Add URI" />
                  <Button alignment="CENTER" layoutX="528.0" layoutY="13.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="60.0" text="Explore" />
                  <CheckBox layoutX="14.0" layoutY="18.0" mnemonicParsing="false" prefHeight="17.0" prefWidth="17.0" />
                  <Separator layoutY="51.0" nodeOrientation="LEFT_TO_RIGHT" prefHeight="3.0" prefWidth="645.0" />
               </children>
            </Pane>
         </children>
    </AnchorPane>
  </children>
</VBox>

NewCrawler.fxml

<AnchorPane fx:controller="wsa.gui.AddCrawlerController" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <TextArea layoutX="119.0" layoutY="89.0" prefHeight="237.0" prefWidth="467.0" />
      <Text layoutX="44.0" layoutY="52.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Domain" wrappingWidth="74.13671875">
         <font>
            <Font size="20.0" />
         </font>
      </Text>
      <TextField layoutX="119.0" layoutY="32.0" prefHeight="25.0" prefWidth="467.0" />
      <Text layoutX="44.0" layoutY="111.0" strokeType="OUTSIDE" strokeWidth="0.0" text="URI list" textAlignment="CENTER" wrappingWidth="74.13672208786011">
         <font>
            <Font size="20.0" />
         </font>
      </Text>
      <Text layoutX="119.0" layoutY="85.0" strokeType="OUTSIDE" strokeWidth="0.0" text="one URI on each line " textAlignment="CENTER" wrappingWidth="467.00000166893005" />
      <Button fx:id="addCrawlerButton" layoutX="260.0" layoutY="353.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="115.0" onMouseClicked="#addNewCrawler" text="Start Crawling" />
      <Button fx:id="abortButton" layoutX="118.0" layoutY="353.0" mnemonicParsing="false" onMouseClicked="#abortCurrentWindow" prefHeight="25.0" prefWidth="115.0" text="Abort" />
   </children>
</AnchorPane>

MainInterface NewCrawler

2 个答案:

答案 0 :(得分:0)

据我所知,您需要一个动态的itemCrawler列表。

您应该使用带有自定义ListView的{​​{1}}来构建自定义CellFactory来表示itemCrawler,而不是对newCrawler进行硬编码。

本教程将告诉您如何执行此操作:http://docs.oracle.com/javafx/2/ui_controls/list-view.htm

答案 1 :(得分:0)

我对此并不是100%肯定,所以如果我错了,请纠正我。

在NewCrawler的控制器中,您可以在其构造函数中加载FXML。然后,您可以实例化NewCrawler控制器并与MainController中的任何其他对象一起使用它。