1

カスタム JavaFX UI コントロールで、コントロールの隅にテキストを配置したいと考えています。私のスキンクラスのソースコードは次のとおりです。

double width = control.getWidth();
double height = control.getHeight();

Text test1Text = new Text(0, 0, "top left");
Text test2Text = new Text(0, height-1, "bottom left");
Text test3Text = new Text("top right");
test3Text.relocate(width - test3Text.getLayoutBounds().getWidth(), 0);
Text test4Text = new Text("bottom right");
test4Text.relocate(width - test4Text.getLayoutBounds().getWidth(), height-1);

残念ながら、特定の座標でテキストを作成するか、座標なしで作成して後で再配置するかによって、違いが生じるようです。

  • 最初のケースでは、コンストラクターの座標はテキストの左下の座標になります。
  • 2 番目のケースでは、指定された座標は左上の座標になります。

この奇妙な動作のアイデアはありますか?

4

2 に答える 2

3

Text(0,0) の位置から右上に描画されています。たとえば、new Text("Hello")境界を作成して要求すると、負の垂直座標があることがわかります[minX:0.0, minY:-12.94921875]

私見が次の理由はText、コントロールで描画されており、テキストのベースラインをより重視しているためです。「water」と「Water」というテキストが表示された 2 つのボタンを想像してみてください。左上隅ではなく、ベースラインに沿って配置されていることが実際には予想されます。

ここに画像の説明を入力

relocate()反対側のメソッドは、通常Nodeの s で動作し、常に左上隅に対して計算されるレイアウトを操作します。

于 2013-03-01T13:52:51.900 に答える
1

JavaFX はほとんどの部分がオープンソース化されているため、(JavaFX 8)
javafx.scene.text.Textjavafx.scene.Nodeの両方のコードを次に示します。詳しく調べることはできませんでしたが、とが異なることを行っている
ことは明らかです 。Text constructorNode#relocate()

public Text(double x, double y, String text) {
    this(text);
    setX(x);
    setY(y);
}

ノード#再配置()

public void relocate(double x, double y) {
        setLayoutX(x - getLayoutBounds().getMinX());
        setLayoutY(y - getLayoutBounds().getMinY());

        PlatformLogger logger = Logging.getLayoutLogger();
        if (logger.isLoggable(PlatformLogger.FINER)) {
            logger.finer(this.toString()+" moved to ("+x+","+y+")");
        }
}

以上が私の考えです、すみません。

于 2013-02-28T20:02:06.867 に答える