2016-12-11 12 views
0

私は2つのjavaFxウィンドウを持っています。最初のウィンドウは、ComboBoxButtonで、2番目のモーダルウィンドウを開きます。第二ウィンドウで別のウィンドウからComboBox値を取得するTextFieldコントロール

MainControllerウィンドウのComboBoxにテキストフィールド値を追加するTextFieldButtonControlを持っています。私はそれをどうやって行うのか分からない。説明された例で私にとって大きな助けになります。以下は、クラスである:

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

[Passing Parameters 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

もメインFXMLに使用Controllerクラスの新しいインスタンスを作成すると、表示された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); 
    } 
} 
:新たなステージを表示します

この方法では、2番目のシーンを再利用する場合は、resultフィールドをリセットする機能も追加する必要があります。

+0

私はまだJavaの新しいので少し複雑に思えます。しかし、それは動作し、私はそれが実際にどのように動作するかを見るためにそれを勉強します。 – kodr

+0

textField.getScene()。getWindow()。hide();を使用しない場合。それはいくつかの項目を追加しないでください。 – kodr

関連する問題