2017-11-16 6 views
1

シーンに既に付いているが、不可視に設定されているノードの境界(特に高さと幅)を決める方法はありますか?JavaFX:目に見えない間にノードの境界を特定しますか?

私はその幅が100pxにを超えた場合にのみ、画面上にラベルを表示したい...しかし、それは常に0ではありません:

@Override 
public void start(Stage primaryStage) { 
    Group root = new Group(); 
    Scene scene = new Scene(root, 500, 500, Color.BLACK); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 

    Label n = new Label(); 
    n.setVisible(false); 
    n.setStyle("-fx-background-color: red;"); 
    root.getChildren() 
     .addAll(n); 
    n.textProperty() 
     .addListener((v, ov, nv) -> { 
      System.out.println(n.getBoundsInParent()); 
      n.setVisible(n.getWidth() > 100); 
     }); 
    n.setText("TEST11111111111111111111111"); 
}  

SYSOUTの結果:(もn.getWidth()には優れています)

このBoundingBox [ミンクス:0.0、minYの:0.0、minZ:0.0、幅:0.0、高さ:0.0、深さ:0.0、MAXX:0.0、MAXY:0.0、maxZ:0.0]

トリックはありますか?

ありがとうございます!

+0

'Text'ノードを使用してください。 'Text'ノードがあなたが望む長さに達すると、' Text'ノードのテキストでラベルを設定し、ラベルを表示します。 https://stackoverflow.com/questions/19361211/measure-the-length-of-text-in-javafx – Sedrick

答えて

0

問題は、テキストプロパティの変更をリッスンし、ノードの幅がその時点で更新されることを期待していることです。しかしそうではありません。ノードの幅は、applyCSSとレイアウトルーチン(Get the height of a node in JavaFX (generate a layout pass)参照)で構成されるレンダーパス中にのみ計算され、設定されます。更新されたノードのサイズが計算される前に、コードがノードを不可視に誤って設定します。

ノードの可視性を判断するためにtextプロパティのリスナーを使用する代わりに、バインディング式を使用してvisibilityプロパティの目的のwidthプロパティに直接バインディングを作成することをお勧めします。このアプローチの一例を以下に示す。表示するテキストが必要な幅(この場合は100ピクセル)よりも長い場合にのみラベルが表示されることがわかります。

short text longer text

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 

public class BoundSample extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     Pane root = new Pane(); 
     Scene scene = new Scene(root, 200, 100); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     Label n = new Label(); 
     n.setVisible(false); 
     n.visibleProperty().bind(n.widthProperty().greaterThan(100)); 

     TextField textField = new TextField("TEST11111111111111111111111"); 
     n.textProperty().bind(textField.textProperty()); 
     textField.relocate(0, 50); 

     root.getChildren().addAll(n, textField); 
    } 
} 
関連する問題