2016-08-19 15 views
2

私はこの問題を尋ねる前にどこでも解決策を探しました。既に存在する場合は、報告してください。実際にJavaFX、タブ間のパラメータを渡すコントローラ

私はこのような状況があります:すべてのための

CLICK TO VIEW THE IMAGE

TabLayout.fxml

<JFXTabPane fx:id="tabbedPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefWidth="500.0" tabClosingPolicy="UNAVAILABLE" tabMinWidth="100.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.TAB.TabController" stylesheets="@tab.css"> 
<tabs> 
    <Tab id="anagrafeTab" closable="false" text="Anagrafe"> 
    <content> 
     <fx:include fx:id="anagrafeL" source="/application/Anagrafe/AnagrafeLayout.fxml"/> 
    </content> 
    </Tab> 
    <Tab id="visiteTab" closable="false" text="Visite"> 
    <content> 
     <fx:include fx:id="visiteL" source="/application/Visite/VisiteLayout.fxml"/> 
    </content></Tab> 
    <Tab id="latteTab" closable="false" text="Produzione Latte"> 
    <content> 
     <fx:include fx:id="latteL" source="/application/Latte/LatteLayout.fxml"/> 
    </content> 
    </Tab> 
    <Tab id="partiTab" closable="false" text="Parti" > 
    <content> 
     <fx:include fx:id="partiL" source="/application/Parti/PartiLayout.fxml"/> 
    </content> 
    </Tab> 
</tabs> 
</JFXTabPane> 

レイアウト "が含まれる":

  • AnagrafeLayout.fxml
  • 私がモデルとすべてのレイアウトのためのコントローラが、ユニークな発信者を持っているよりも
  • PartiLayout.fxml

  • LatteLayout.fxml
  • VisiteLayout.fxml
  • public class Tab { 
    
    public Tab() { 
        inizializza(); 
    } 
    
    private void inizializza() { 
        try { 
         Stage stage = new Stage(); 
         stage.setTitle("Dati"); 
         stage.getIcons().add(new Image(getClass().getResourceAsStream("insert.png"))); 
    
         FXMLLoader loader = new FXMLLoader(); 
         loader.setLocation(getClass().getResource("TabLayout.fxml")); 
         JFXTabPane root = (JFXTabPane) loader.load(); 
    
         Scene scene = new Scene(root,660,430); 
         stage.setScene(scene); 
    
         stage.show(); 
         //ScenicView.show(scene); 
    
        } catch(Exception e) { 
         e.printStackTrace(); 
        } 
    
        } 
    } 
    

    Iは、各コントローラにObservableList<Visite> data = FXCollections.observableArrayList();を渡す必要があります。

    私は本当にやり方がわかりません。かなり長いクラスなので、コントローラを1台使用しません。

    EDIT:上述のよう

    TABController.java

    public class TabController implements Initializable { 
    
    @FXML 
    private TabPane tabbedPane; 
    
    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
        assert tabbedPane != null : "fx:tabbedPane=\"in\" was not injected: check your FXML file 'TabLayout.fxml'."; 
    
        tabbedPane.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> { 
    
         if(tabbedPane.getSelectionModel().getSelectedIndex() != 0) { 
          tabbedPane.getScene().getWindow().setWidth(1171); 
          tabbedPane.getScene().getWindow().setHeight(700); 
         } else { 
          tabbedPane.getScene().getWindow().sizeToScene(); 
         }   
        }); 
        } 
    } 
    

    EDIT2

    4つのタブは、それぞれ自分のモデルクラスを有しています。 私は4つの異なるリストを持っていますが、最初は空です。なぜなら、各タブ用のテーブルがあるので、動的に満たされているからです。 リストは、異なるインターンシップによってtabPaneが呼び出されたときに作成されます。 以前の負荷の可能性があり、この情報をコントローラに渡す必要があるため、これらのリストが必要です。

    は実際には、この処理が行われます。

    1)

    コール]タブのテーブルからロードされた空のリストを作成し、関数insert。その後、データはクローズ時にデータベースに格納されます。

    2)

    コールリストを作成し、データベースからデータを取得し、次いで、改変することができるテーブルに送信し、特定のフラグを機能インサートを呼び出す関数が表示されます。

    は、私は質問の曖昧さは、今、私はこのよう

    public class TabController implements Initializable { 
    
    @FXML 
    private TabPane tabbedPane; 
    
    @FXML 
    private VisiteController visiteLController; 
    private ObservableList<Visite> dataVisite = FXCollections.observableArrayList(); 
    private ObservableList<Visite> dataDelVisite = FXCollections.observableArrayList(); 
    
    @FXML 
    private LatteController latteLController; 
    private ObservableList<Latte> dataLatte = FXCollections.observableArrayList(); 
    private ObservableList<Latte> dataDelLatte = FXCollections.observableArrayList(); 
    
    @FXML 
    private PartiController partiLController; 
    private ObservableList<Parti> dataParti = FXCollections.observableArrayList(); 
    private ObservableList<Parti> dataDelParti = FXCollections.observableArrayList(); 
    
    
    @Override 
    public void initialize(URL arg0, ResourceBundle arg1) { 
        assert tabbedPane != null : "fx:tabbedPane=\"in\" was not injected: check your FXML file 'TabLayout.fxml'."; 
    
        tabbedPane.getSelectionModel().selectedItemProperty().addListener((ov, oldTab, newTab) -> { 
    
         if(tabbedPane.getSelectionModel().getSelectedIndex() != 0) { 
          tabbedPane.getScene().getWindow().setWidth(1171); 
          tabbedPane.getScene().getWindow().setHeight(700); 
         } else { 
          tabbedPane.getScene().getWindow().sizeToScene(); 
         }   
        });  
    
        visiteLController.setData(dataVisite, dataDelVisite); 
        latteLController.setData(dataLatte, dataDelLatte); 
        partiLController.setData(dataParti, dataDelParti); 
    } 
    } 
    

    およびsetメソッドで明らかに各コントローラ

    に変更解いてる

    の前にするために、私は謝罪、私ははっきりしていた願っています

    public void setData(ObservableList<Visite> data, ObservableList<Visite> dataDel) { 
        this.data = data; 
        this.dataDel = dataDel; 
        liveSearh(); 
    } 
    
    +1

    あなたは 'TabController'のコードを投稿できますか?これは、http://stackoverflow.com/questions/37068243/share-model-with-nested-controller –

    +0

    の複製のようです。 今、私はリンク –

    +0

    を振り返ります。質問を明確にしてください。正確には、各コントローラーは何を必要としていますか?また、それぞれのニーズに応じたデータを作成するか、それらのデータにアクセスできるのはどこですか? –

    答えて

    0

    で作成されたコントローラをリストに渡すことができるように、controller factoryを使用することをお勧めします。。

    だから彼らが観測リストを取るコンストラクタを持っているので、まず、すべてのコントローラを定義します:

    public class TabController implements Initializable { 
    
        private final ObservableList<Visite> data ; 
    
        public TabController(ObservableList<Visite> data) { 
         this.data = data ; 
        } 
    
        // existing code... 
    } 
    

    と、例えば、

    public class AnagrafeController implements Initializable { 
    
        private final ObservableList<Visite> data ; 
    
        public AnagrafeController(ObservableList<Visite> data) { 
         this.data = data ; 
        } 
    
        // existing code... 
    } 
    

    は今、あなたは本質的には、コントローラの工場を、必要としますClassを受け取り、そのクラスのコントローラを返す関数です。これは、ほんの少しの反射を必要とします:

    FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("TabLayout.fxml")); 
    
    ObservableList<Visite> data = FXCollections.observableArrayList(); 
    
    loader.setControllerFactory((Class<?> controllerType) -> { 
        try { 
         Constructor<?>[] constructors = controllerType.getConstructors(); 
         for (Constructor<?>[] constructor : constructors) { 
          if (constructor.getParameterCount() == 1 && 
           constructor.getParameterTypes()[0] == ObservableList.class) 
    
           return constructor.newInstance(data); 
          } 
         } 
    
         // no suitable constructor found, just use default: 
         return controllerType.newInstance(); 
    
        } catch (Exception exc) { 
         System.out.println("Could not create controller:"); 
         exc.printStackTrace(); 
         return null ; 
        } 
    }); 
    
    JFXTabPane root = loader.load(); 
    
    // ... 
    

    これは、観測可能なリスト(data)とコントローラファクトリを作成するコントローラクラスをパラメータとして観察可能なリストを取るコンストラクタを持つ場合、dataをとして渡されることを保証しますそのパラメータ。

    <fx:include>を使用すると、同じコントローラファクトリが含まれているFXMLファイル用のコントローラを作成するため、適切なコンストラクタを定義すると仮定すると、同じリストもそれらのコントローラに渡されます。

    また、これは基本的にコントローラへのオブジェクトの注入を自動化する依存性注入フレームワークを考慮することもできます。 Afterburner.fxは、非常に優れたJavaFX依存性注入フレームワークです。

    +0

    タブコントローラは、データリストを必要としませんが、各コントロールのために私は別のリストを与える必要があります。 コントローラクラスごとに工場コントローラを作成する必要がありますか? 1つではなく2つのリストを送信すれば? 私はあなたの応答を待っていますが、私はあなたが私に送ったリンクに存在する解決策に向かっています。つまり、TabControllerクラスでは、さまざまなコントローラクラスのコントローラを宣言し、異なるコントローラクラスに存在するセッタを呼び出します。 –

    +1

    OK、私は、異なるコントローラ間でデータを共有する必要があるという問題を想定していました。 'TabController'のリストにアクセスできるならば、他のコントローラのそれぞれで' setData(...) 'メソッドを定義し、' TabController'の 'initialize()'からリストを渡すのはなぜでしょうか?方法? –

    +0

    私の最初の解決策は私の間違いではうまくいきません。私はコントローラ変数の名前を正しく宣言しませんでした。 私はあなたが最初に私に送ったリンクのおかげで気づいた:) –

    関連する問題