0

カスタムコントロールのスキンで、コントロールのサイズの三角形を描画し、フレームのサイズが変更されると三角形が大きくなるようにします。次のコードがありますが、フレームのサイズを変更すると、境界のサイズが大きくなるだけです。正しくサイズ変更するにはどうすればよいですか?

private void update()
{
    Bounds bounds = node.getBoundsInParent();
    Path path = new Path();
    path.getElements().add(
            new MoveTo(
            bounds.getWidth() / 2 + bounds.getMinX(), 
            bounds.getMinY()));
    path.getElements().add(
            new LineTo(bounds.getMaxX(), bounds.getMaxY()));
    path.getElements().add(
            new LineTo(bounds.getMinX(), bounds.getMaxY()));
   path.setFill(Color.RED);
   node.getChildren().setAll(path);                
}

編集:スイングを使用して、私は次のことを行います。しかし、JavaFXで動作させることはできません。

public class Arrow extends JPanel
{

@Override
protected void paintComponent(Graphics graphics) {
    super.paintComponent(graphics);
    Dimension size = getSize();

    Point top = new Point(size.width/2,0);
    Point bottomRight = new Point(size.width, size.height);
    Point bottomLeft = new Point(0, size.height);

    GeneralPath path = new GeneralPath();
    path.moveTo(top.x, top.y);
    path.lineTo(bottomRight.x, bottomRight.y);
    path.lineTo(bottomLeft.x, bottomLeft.y);
    path.lineTo(top.x, top.y);

    Graphics2D g2d = (Graphics2D)graphics.create();
    g2d.setColor(Color.RED);
    g2d.fill(path);
    g2d.dispose();
}
}
4

1 に答える 1

3

カスタム コントロールのスキンで、コントロールのサイズの三角形を描画し、フレームのサイズが変更されると三角形が大きくなるようにしたいと考えています。

JavaFX のデフォルトの Caspian スタイルの ScrollBar サム実装は、まさにこれを行います。-fx-shape css 属性を介してそれを行います。

.scroll-bar:vertical .increment-arrow {
    -fx-background-color: -fx-mark-highlight-color, -fx-mark-color;
    -fx-background-insets: 1 0 -1 0, 0;
    -fx-padding: 0.333333em 0.5em 0.0em 0.0em; /* 4 6 0 0 */
    -fx-shape: "M -3 0 L 0 4 L 3 0 z";
}

-fx-shape のドキュメントは次のとおりです。

SVG パス文字列。ここで形状を指定すると、領域は長方形や角丸長方形ではなく、その形状になります。このパス文字列の構文。


明らかに無関係な質問のタイトルに:

javafx 2.0で特定のレイアウトのノードのサイズを取得しますか?

それで、あなたが本当に欲しいサイズはどれくらいですか?

ノードの視覚的な境界は、親の境界です。ノードのレイアウト境界は次のとおりです。

このノードのレイアウト計算に使用する長方形の境界。layoutBounds は、ノードの視覚的な境界とは異なる場合があり、ノード タイプに応じて異なる方法で計算されます。

先に述べた -fx-shape css のものを使用しない場合 (あなたがしていることのために)、コントロールの親領域内に三角形をレイアウトし、三角形が親リージョンに適用された変換を自動的に継承します。

ノードのレイアウトは、アクティブなシーンに追加され、ノードで css パスが実行されるまで、完全に計算されないことがよくあります。そのため、適切なプロパティ (boundsInLocal など) にリスナーを追加し、リスナーが起動されるたびに三角形のレンダリングを更新できます。これは、カスタム コントロールとスキンを作成しなくても実行できます。

カスタム コントロールとスキン ルートを使用する場合は、コントロールのlayoutChildrenメソッドをオーバーライドして、そこでレイアウト作業を行うことができますが、これはかなり洗練された高度なユース ケースであり、パフォーマンスが重要なオブジェクトを作成しようとしている場合を除き、多くの場合不要です。 、再利用可能なコントロール。

于 2012-07-05T21:46:11.813 に答える