2012-07-05 52 views
0

在我想画一个三角形控件的大小,并有三角形自定义控件的皮肤成长为帧大小。我有以下代码,但边界只是在调整框架大小时增加。如何让它正确调整大小?在javafx 2.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(); 
} 
} 
+0

我不能有什么不对“边界大小为我调整框架只会增加”? –

回答

2

在我想画一个三角形控件的大小,并有三角形成长为帧大小的自定义控件的肌肤。

JavaFX默认的Caspian风格中的ScrollBar thumb实现完全是这样的。它确实其经由-fx形的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吗?

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

节点的可视边界是它的bounds in parent。 节点的layout bounds是:

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

如果不使用-fx形CSS的东西,我前面提到的(你在做什么),你可能想使用布局界限,你会的亲区域内铺设的三角“控制”和“三角形”将自动继承应用于父区域的所有变换。

布局节点往往不完全计算,直到它已被添加到活动场景和一个CSS通被在节点上执行。因此,您可以将侦听器添加到相应的属性(例如boundsInLocal),并在侦听器被触发时更新您的三角形渲染。这可以在不创建自定义控件和皮肤的情况下完成。

如果你确实去了自定义控件和皮肤路线,那么你可以覆盖你的控件的方法,并在那里做你的布局工作 - 但这是一个相当复杂的高级用例,除非你尝试创建性能至关重要的可重用控件。