2016-12-11 88 views
0

我有兩個javaFx窗口。第一個有ComboBoxButton打開第二個模式窗口。從另一個窗口獲取ComboBox值TextField控件

在第二個窗口中有一個TextFieldButtonControl到文本字段值添加到MainController窗口的ComboBox。我不知道如何去做。有了解釋的例子會對我很有幫助。下面是類:

Main.java

package sample; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.stage.Stage; 

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception{ 
     Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); 
     primaryStage.setTitle("Hello World"); 
     primaryStage.setScene(new Scene(root, 300, 275)); 
     primaryStage.show(); 
    } 


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

Contrller.java

package sample; 

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.Parent; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.TextField; 
import javafx.stage.Modality; 
import javafx.stage.Stage; 

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 

public class Controller implements Initializable{ 
    @FXML 
    public ComboBox<String> combo; 
    @FXML 
    Button button; 
    public ObservableList<String> list = FXCollections.observableArrayList("A"); 
    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     setCombo(); 

    } 

    public void setCombo(){ 
     combo.setItems(list); 
    } 

    public void openModal() throws IOException { 
     Stage primaryStage = new Stage(); 
     Parent root = FXMLLoader.load(getClass().getResource("sec.fxml")); 
     primaryStage.setTitle("Send Mail"); 
     primaryStage.setScene(new Scene(root,800,600)); 
     primaryStage.initModality(Modality.WINDOW_MODAL); 
     //primaryStage.initOwner((Stage) menuBar.getScene().getWindow()); 
     primaryStage.show(); 
    } 
} 

FXML的主窗口:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.ComboBox?> 
<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.HBox?> 
<?import javafx.scene.layout.StackPane?> 
<?import javafx.scene.layout.VBox?> 

<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> 
    <children> 
     <StackPane prefHeight="67.0" prefWidth="600.0"> 
      <children> 
       <Label text="Get value from Another Child Dialog" /> 
      </children> 
     </StackPane> 
     <HBox prefHeight="100.0" prefWidth="200.0"> 
      <children> 
       <Label text="Add Value of TextBox:" /> 
       <ComboBox fx:id="combo" prefWidth="150.0" /> 
      </children> 
     </HBox> 
     <Button fx:id="button" mnemonicParsing="false" onAction="#openModal" text="Open Dialog" /> 
    </children> 
</VBox> 

現在第二個窗口Sec.Java

package sample; 

import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.control.TextField; 

import java.net.URL; 
import java.util.ArrayList; 
import java.util.ResourceBundle; 

/** 
* Created by tracedot on 12/11/16. 
*/ 
public class Sec implements Initializable{ 
    @FXML 
    Button button; 
    @FXML 
    TextField textfield; 
    public Controller controller=new Controller(); 

    public void setToCombo(){ 
     String cbvalue= textfield.getText(); 
     controller.combo.getItems().add(cbvalue); 
     //controller.combo.itemsProperty().setValue(new ArrayList<String>().add()); 
    } 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     //setToCombo(); 

    } 
} 

第二個窗口FXML:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.control.TextField?> 
<?import javafx.scene.layout.HBox?> 

<HBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Sec"> 
    <children> 
     <TextField fx:id="textfield" /> 
     <Button fx:id="button" mnemonicParsing="false" onAction="#setToCombo" text="Add to Combo" /> 
    </children> 
</HBox> 
+0

[傳遞參數JavaFX FXML]的可能重複(http://stackoverflow.com/questions/14187963/passing-parameters-javafx-fxml) – Omid

+0

也相關:http://stackoverflow.com/questions/40117925/javafx -many-static-fxml-controllers/40353976#40353976 – Omid

回答

0

創建Controller類也用於主FXML的新實例不會幫助你與所顯示的FXML使用的實例通信。您必須將現有的控制器傳遞到與第二FXML使用的Sec實例:

public class Sec implements Initializable{ 

    ... 

    private Controller controller; 

    public void setController(Controller controller) { 
     this.controller = controller; 
    } 

    ... 

} 
public void openModal() throws IOException { 
    Stage primaryStage = new Stage(); 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("sec.fxml")); 
    Parent root = loader.load(); 
    primaryStage.setTitle("Send Mail"); 
    primaryStage.setScene(new Scene(root,800,600)); 
    primaryStage.initModality(Modality.WINDOW_MODAL); 
    //primaryStage.initOwner((Stage) menuBar.getScene().getWindow()); 

    loader.<Sec>getController().setController(this); 
    primaryStage.show(); 
} 

如果您想輸入後關閉新窗口,你也可以使用showAndWait()以顯示新的階段:

public class Sec implements Initializable{ 

    ... 
    private String result = null; 

    public String getResult() { 
     return result; 
    } 

    public void setCombo() { 
     result = textfield.getText(); 
     textField.getScene().getWindow().hide(); 
    } 

    ... 

} 
public void openModal() throws IOException { 
    Stage primaryStage = new Stage(); 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("sec.fxml")); 
    Parent root = loader.load(); 
    primaryStage.setTitle("Send Mail"); 
    primaryStage.setScene(new Scene(root,800,600)); 
    primaryStage.initModality(Modality.WINDOW_MODAL); 
    //primaryStage.initOwner((Stage) menuBar.getScene().getWindow()); 

    primaryStage.showAndWait(); 

    String result = loader.<Sec>getController().getResult(); 

    if (result != null) { 
     // if a result was selected, add it to the list 
     list.add(result); 
    } 
} 

請注意,通過這種方法,如果要重新使用第二個場景,還應添加一些功能來重置result字段。

+0

似乎有點複雜,因爲我對java還是一個新手。但它的工作原理,我會研究它,看看它是如何工作的。 – kodr

+0

如果不使用textField.getScene()。getWindow()。hide();那麼它有時候不會添加一些項目。 – kodr

相關問題