2017-06-07 3 views
1

このanswerではローダークラスを使用して、後処理なしでComboBoxを動的にロードします。
前処理に同様のテクニックを使用して、Polygonを再利用しましたが、ポリゴンはitemsのプロパティ、または同様のものを公開しません。 私のソリューションは、ポリゴンを拡張して、そのようなプロパティを追加しました:FXMLファイルの両方にFXMLで構築されたポリゴンにポイントを動的にロードします

public class PointsLoader5 { 

    private ObservableList<Double> items; 

    public ObservableList<Double> getItems() { 

     items = FXCollections.observableArrayList(
         new Double[] {100.,0.,100., 100., 0., 0.}); 
     return items; 
    } 
} 

用途:

<?xml version="1.0" encoding="UTF-8"?> 
<?import java.lang.Double?> 
<?import javafx.xml_polygon.DPolygon?> 

<DPolygon fx:id="triangle" fill="GREEN" stroke="RED" strokeType="INSIDE" 
    items="${pointsLoader.items}" xmlns:fx="http://javafx.com/fxml/1" > 
</DPolygon> 

そして

public class DPolygon extends javafx.scene.shape.Polygon{ 

    public ObjectProperty<ObservableList<Double>> items = 
      new SimpleObjectProperty<>(this, "items"); 

    public DPolygon() { 
     items.addListener(new ChangeListener<ObservableList<Double>>() { 
      @Override 
      public void changed(ObservableValue<? extends ObservableList<Double>> 
      observable, ObservableList<Double> oldValue, 
      ObservableList<Double> newValue) { 
       addPolyPoints(); 
      } 
     }); 
    } 

    private void addPolyPoints() { super.getPoints().setAll(items.get());} 

    public ObjectProperty<ObservableList<Double>>itemsProperty() { return items; } 

    public final ObservableList<Double> getItems() {return items.get(); } 

    public final void setItems(ObservableList<Double> value) {items.set(value); } 
} 

ポイントを供給するために、Loaderクラスを持っていますすべて一緒にテストしてください:

public class DrawTrianle5 extends Application { 

    @Override 
    public void start(Stage primaryStage) throws IOException { 

     primaryStage.setTitle("Set points using loader"); 
     Group group = new Group(); 
     GridPane grid = new GridPane(); 
     grid.setAlignment(Pos.CENTER); 
     grid.setHgap(10); 
     grid.setVgap(10); 
     grid.setPadding(new Insets(25, 25, 25, 25)); 
     group.getChildren().add(grid); 

     FXMLLoader loader = new FXMLLoader(getClass().getResource("triangle/Triangle5.fxml")); 
     loader.getNamespace().put("pointsLoader", new PointsLoader5()); 
     DPolygon triangle = loader.load(); 

     grid.add(triangle, 0, 0); 
     Scene scene = new Scene(group, 450, 175); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

問題なく動作します。
質問:正しいアプローチですか、FXMLで構築されたPolygonにポイントを動的にロードする方がいいですか?後処理は避けてください。

+0

あなたが求めていることは本当に明確ではありません。 "Polygonは' items'プロパティやそれに類するものを公開しません。 " ObservableList getPoints()を公開します。なぜそれを使用しないのですか? –

+0

'Polygon'を後処理せずに使う方法を知りません。あなたは例を投稿できますか? – c0der

+0

おそらく問題を明確にする必要があります。 「ポリゴンの後処理」とはどういう意味ですか? (Post = after:* *?)あなたが解決しようとしている実際の問題は何ですか? –

答えて

1

現在のPolygonクラスでこれを行うのを妨げる唯一のことは、適切なコンストラクタ引数が@NamedArg annotationでないことです。

だから、これを行うための一つの方法は、次のようになりますせずにアプローチがなければならないように感じる

import java.util.Arrays; 

import javafx.application.Application; 
import javafx.fxml.FXMLLoader; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.shape.Polygon; 
import javafx.stage.Stage; 

public class PolygonTest extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource("Polygon.fxml")); 
     loader.getNamespace().put("points", Arrays.asList(100.0,0.0,100.0,100.0,0.0,0.0)); 
     Polygon poly = loader.load(); 
     Scene scene = new Scene(new Group(poly), 450, 175); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

import java.util.List; 

import javafx.beans.NamedArg; 
import javafx.scene.shape.Polygon; 

public class DPolygon extends Polygon { 

    public DPolygon(@NamedArg("points") List<Double> points) { 
     super(points.stream().mapToDouble(Double::doubleValue).toArray()); 
    } 
} 

次に、あなただけの

<DPolygon xmlns:fx="http://javafx.com/fxml/1" points="$points" fill="GREEN" stroke="RED" strokeType="INSIDE" /> 

テストを必要としますサブクラスは全くありませんが、動作するものを見つけることはできません。

+0

とほぼ同等です。ありがとう。私は小さな変更を提案します: 'loader.getNamespace()。put(" points "、新しいdouble [] {100.0,0.0,100.0,100.0,0.0,0.0));' 'DPolygon'をさらに単純化します。 – c0der

関連する問題