Java 将点动态加载到由FXML构造的多边形
在这种情况下,loader类用于在构建组合框时动态加载组合框(无需后期处理)Java 将点动态加载到由FXML构造的多边形,java,dynamic,javafx-8,fxml,Java,Dynamic,Javafx 8,Fxml,在这种情况下,loader类用于在构建组合框时动态加载组合框(无需后期处理) 我想使用一种类似于预处理和重用的技术,但是多边形不公开项属性或类似的属性。 我的解决方案是扩展多边形并添加这样的属性: public class DPolygon extends javafx.scene.shape.Polygon{ public ObjectProperty<ObservableList<Double>> items = new Simple
我想使用一种类似于预处理和重用的技术,但是多边形不公开
项
属性或类似的属性。
我的解决方案是扩展多边形并添加这样的属性:
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); }
}
并将其放在一起进行测试:
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
构造的多边形,避免后处理?唯一阻止您使用当前的多边形
类执行此操作的是,没有合适的构造函数参数
因此,一种方法是:
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());
}
}
感觉应该有一种完全没有子类的方法,但我找不到一种有效的方法。不太清楚你在问什么。“多边形不公开项
属性或类似属性。”它公开可观察列表getPoints()
。为什么不直接使用它呢?我不知道如果不对多边形进行后期处理,如何使用它。你能举个例子吗?也许你需要澄清这个问题。“多边形后处理”是什么意思?(Post=after:after what?)你想解决的实际问题是什么?我不想解决。我这样做是为了学习。我想FXML
构造Polygon
s,每个都有不同的点,就像我在使用构造函数一样。我试图避免构造一个空的多边形
和设置它的点(我称之为后处理),但实际上您确实构造了一个空多边形。。。因为您的DPolygon
构造函数隐式调用super()
。FXML大致相当于DPolygon triangle=new DPolygon()代码>triangle.setItems(pointsLoader.getItems())代码>漂亮而简单。谢谢我建议做一个小改动:loader.getNamespace().put(“points”,新的double[]{100.0,0.0100.0100.0,0.0})
这使得DPolygon
更加简单。
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);
}
}
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());
}
}
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);
}
}