2012-07-05 84 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),並在偵聽器被觸發時更新您的三角形渲染。這可以在不創建自定義控件和皮膚的情況下完成。

如果你確實去了自定義控件和皮膚路線,那麼你可以覆蓋你的控件的方法,並在那裏做你的佈局工作 - 但這是一個相當複雜的高級用例,除非你嘗試創建性能至關重要的可重用控件。