JavaFx Path nodeに翻訳とスケールの両方を適用する際にいくつか問題があります。 setScaleX()またはscaleY()のいずれかの呼び出しを使用してスケールを適用すると、relocate()への呼び出しによって適用された翻訳は、長い間認められていないことがわかりました。スケール適用時にパス変換が適用されない
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class MainApp extends Application {
@Override
public void start(Stage stage) throws Exception {
StackPane myPane = new StackPane(new MyRegion());
Scene myScene = new Scene(myPane);
stage.setScene(myScene);
stage.setWidth(500);
stage.setHeight(500);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
そしてMyRegion
クラス:
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.shape.ClosePath;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
public class MyRegion extends Region{
private Path pointer;
private ObjectProperty<Color> pointerColour =
new SimpleObjectProperty<>(Color.ORANGE);
public MyRegion() {
initGraphics();
}
private void initGraphics(){
pointer = new Path();
pointer.setFill(pointerColour.get());
pointer.setStrokeWidth(0);
pointer.getElements().add(new MoveTo(50, 50));
pointer.getElements().add(new LineTo(50, 200));
pointer.getElements().add(new LineTo(200, 200));
pointer.getElements().add(new ClosePath());
pointer.relocate(70, 70);
}
@Override
protected void layoutChildren() {
getChildren().removeAll(pointer);
getChildren().addAll(pointer);
}
@Override
protected double computePrefHeight(double width) {
return 200;
}
@Override
protected double computePrefWidth(double height) {
return 200;
}
}
これにより設定された共oridinates(70,70)に位置する三角形をもたらすこのメインクラスを使用して、例えば
、方法initGraphics()
で行pointer.relocate(70, 70)
:
private void initGraphics(){
pointer = new Path();
pointer.setFill(pointerColour.get());
pointer.setStrokeWidth(0);
pointer.getElements().add(new MoveTo(50, 50));
pointer.getElements().add(new LineTo(50, 200));
pointer.getElements().add(new LineTo(200, 200));
pointer.getElements().add(new ClosePath());
pointer.relocate(70, 70);
pointer.setScaleX(2);
pointer.setScaleY(2);
}
次の結果、::
initGraphics()は、今のように見える `ように、私は今のパスにXとYのスケーリングファクターを追加した場合したがって、三角形のサイズは予想どおりに拡大されましたが、(0,0)
から描画されます。これは、ほぼMoveTo()
オブジェクトがPath
で無視されたかのようです。
Pathの作成時にスケールメソッドが呼び出される場所は関係ありません。結果は同じです。私も最初のPathElement
をMoveTo(0,0)
として設定しようとしましたが、結果は同じです。
これらのメソッド呼び出しの仕組みを誤解していますか、それともJavaFxノードのバグですか?
こんにちはホセ、Iあなたの答えに従ってください。あなたの説明に従っていることを懸念していることの1つは、私のスクリーンショットでは、頂点が5ピクセルで切り取られると予想していましたが、そうではありません。これを強調するために、scaleX/Yを4に設定すると、これがはっきりと示されるはずですが、そうではありません。頂点は(親の)(0,0)にあります。私は何かを誤解している。 – Kerry
あなたは中心からスケーリングしているので、シーンから伸びて、0から0までの切り取ったパスが表示されます。いずれの場合も、境界ボックス( 'System.out.println(pointer.getBoundsInParent() );)、最小x、y座標を参照してください。 –
私はまだJavaFXでどのようにバインドされているのかについて頭を悩ませていますが、あなたの答えは間違いなく私を助けてくれました。 – Kerry