在javafx 2.0中获取给定布局中节点的大小?

时间:2012-07-05 02:22:01

标签: java javafx-2

在自定义控件的外观中,我想绘制一个控件大小的三角形,并在调整框架大小时使三角形增长。我有以下代码,但是当我调整框架大小时,边界的大小只会增加。如何让它正确调整大小?

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);                
}

编辑:使用swing我将执行以下操作。但我无法在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();
}
}

1 个答案:

答案 0 :(得分:2)

  

在自定义控件的外观中,我想绘制一个控件大小的三角形,并在框架调整大小时使三角形增长。

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";
}

Documentation of -fx-shape是:

  

SVG路径字符串。通过在此处指定形状,区域采用该形状而不是矩形或圆角矩形。此路径字符串的语法。


现在给你明显不相关的问题标题:

  

在javafx 2.0中获取给定布局中节点的大小?

那么你真正想要的尺寸是多少?

Node的视觉界限是bounds in parent。 节点的layout bounds是:

  

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

如果你不使用前面提到过的-fx-shape css(你正在做什么),你可能想要使用布局边界,因为你将在控件的父区域中布置你的三角形。你的Triangle会自动继承任何应用于父Region的变换。

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

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