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 thumb 实现正是这样做的。它通过 -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 中获取给定布局中节点的大小?

那么你真正想要什么尺寸?

Node 的视觉边界是它在 parent 中的边界。节点的布局边界是:

应该用于此节点的布局计算的矩形边界。layoutBounds 可能与节点的视觉边界不同,并且根据节点类型计算不同。

如果您不使用我之前提到的 -fx-shape css 东西(对于您正在做的事情),您可能想要使用布局边界,因为您将在控件的父区域内布置您的三角形,而您的三角形将自动继承应用于父区域的任何变换。

在将节点添加到活动场景并在节点上执行 css 传递之前,通常不会完全计算节点的布局。因此,您可以将侦听器添加到适当的属性(例如 boundsInLocal),并在侦听器被触发时更新您的三角形渲染。这可以在不创建自定义控件和皮肤的情况下完成。

如果您确实采用自定义控件和皮肤路线,那么您可以覆盖控件的layoutChildren方法并在那里进行布局工作 - 但这是一个相当复杂的高级用例,除非您尝试创建性能关键的用例,否则通常是不必要的,可重复使用的控件。

于 2012-07-05T21:46:11.813 回答