2017-10-10 10 views
0

http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htmの説明に従ってカスタムJavaFXコンポーネントを作成しました。カスタムjavafxコンポーネントの属性としてカスタムタイプのFXMLプロパティを設定します

// Component.fxml 
<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Label?> 
<?import javafx.scene.layout.VBox?> 
<fx:root type="javafx.scene.layout.VBox" xmlns:fx="http://javafx.com/fxml"> 
    <Label fx:id="label"/> 
</fx:root> 

// Component.java 
public class Component extends VBox { 

    private final Entity entity; 
    @FXML private Label label; 

    public Component(@NamedArg("entity") Entity entity) { 
     this.entity = entity; 
     FXMLLoader fxmlLoader = new FXMLLoader(); 
     fxmlLoader.setLocation(Component.class.getResource("/Component.fxml")); 
     fxmlLoader.setRoot(this); 
     fxmlLoader.setController(this); 

     try { 
      fxmlLoader.load(); 
     } catch (IOException exception) { 
      throw new RuntimeException(exception); 
     } 
    } 

    @FXML 
    private void initialize() { 
     label.textProperty().set(this.entity.toString()); 
    } 
} 

私はルートレイアウト(カスタムコンポーネントも)にインポートします。

// Root.fxml 
<?xml version="1.0" encoding="UTF-8"?> 

<?import foo.bar.javafx.Component?> 
<?import javafx.scene.layout.AnchorPane?> 
<fx:root type="javafx.scene.layout.AnchorPane"xmlns:fx="http://javafx.com/fxml"> 
// TODO How to pass entity? 
<Component entity=?> 
</Component> 

// Root.java 
public class Root extends AnchorPane { 

    public Root() { 
     FXMLLoader fxmlLoader = new FXMLLoader(); 
     fxmlLoader.setLocation(Root.class.getResource("/Root.fxml")); 
     fxmlLoader.setRoot(this); 
     fxmlLoader.setController(this); 

     try { 
      fxmlLoader.load(); 
     } catch (IOException exception) { 
      throw new RuntimeException(exception); 
     } 
    } 

} 

どのように私は、コンポーネントにエンティティを渡すことができますか? 文字列を渡す方法を知っています - それはちょうど<Component entity="text">です。しかし、どのように任意のクラスのインスタンスを渡すには? P.P.このためにシングルトンパターンを使用したくありません。

+0

'entity'タグを使うには' setEntity'メソッドが必要ですが、 'Entity'はfinalですが、それはできません。なぜあなたはこれをやりますか?あなたは何をしたいのですか? – Sunflame

+0

@Sunflameこれでビューとモデルを分解したいと思います。エンティティはモデルです。コンポーネントビューに関連しています。私の主なメソッドでは、私はモデル(Entityクラス)をインスタンス化し、ビュー(Component)に渡したいと思います。 – McMerphy

+0

質問はあなたのモデルをどうやって得るのですか?あなたのモデルで何をしたいですか? – Sunflame

答えて

1

あなたの問題の解決策は、あなたのコントローラごとにコントローラクラスを作成するなどのコントローラからの成分を分離することが考えられます。 コンポーネントはVBoxのですが、あなたは次のようにそれのために.fxmlを定義することができます。

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

<?import javafx.scene.layout.VBox?> 
<VBox xmlns="http://javafx.com/javafx" 
     xmlns:fx="http://javafx.com/fxml" 
     fx:controller="stackoverflow.one.ComponentController"> 

</VBox> 

それは実体が含まコントローラです:

public class ComponentController implements Initializable{ 

    private Entity entity; 

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

    } 

    public Entity getEntity() { 
     return entity; 
    } 

    public void setEntity(Entity entity) { 
     this.entity = entity; 
    } 
} 

ます。また、このようROORを変更することができます。

<?import javafx.scene.layout.AnchorPane?> 
<AnchorPane xmlns="http://javafx.com/javafx" 
      xmlns:fx="http://javafx.com/fxml" 
      fx:controller="stackoverflow.one.RootController"> 
    <fx:include source="ComponentController.java" fx:id="component"/> 

</AnchorPane> 

次に、ComponentControllerの参照を取得できます。たとえば、サービスから取得したエンティティを設定できます。

public class RootController implements Initializable { 

    @FXML 
    private ComponentController componentController; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     // getting Entity from a service or from any other sources 
     //You may replace this line with an appropriate one for you. 
     Entity entity = getEntity(); 
     componentController.setEntity(entity); 
    } 
} 

は今、あなたはあなたのためにFXMLLoaderんので、あなたのイベントがそれらをロードする必要はありません、コントローラとビューのコンポーネントを分離しています。 これは、オブジェクトを他のビューのコントローラに渡す方法の基本概念です。

関連する問題