2013-12-15 4 views
2

JavaFX 장면 그래프의 임의의 javafx.scene.text.Text 노드 주위에 빨간색 테두리를 그려야합니다 (예 : Button 객체에있는 것들).JavaFX 텍스트 노드 주변에 테두리 그리기

모든 텍스트 노드를 검색 할 수 있지만 장면의 위치를 ​​찾지는 못하지만 x 및 y 속성은 올바르게 설정되지 않은 것처럼 보이지만 너비와 높이가 없습니다.

지금까지 빨간색 구획이있는 사각형을 스택 창에 추가하려고 시도했지만 x와 y는 항상 잘못되어 크기를 얻을 수 없습니다.

답변

5

하나의 솔루션 (예 : HBox의 등) 레이아웃 창에서 텍스트 노드를 감싸 레이아웃 창에 CSS를 사용하는 것입니다 : 또 다른 방법은 다음과 같이 사각형을 사용하는 것입니다

import javafx.application.Application; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.layout.HBox; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class TextBorderExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     final HBox root = new HBox(5); 

     root.getChildren().addAll(
       new Text("This"), new Text("Is"), new Text("A"), createBorderedText("Red"), new Text("Bordered"), new Text("Text") 
     ); 

     primaryStage.setScene(new Scene(root)); 
     primaryStage.show(); 
    } 
    private Node createBorderedText(String text) { 
     final HBox hbox = new HBox(); 
     hbox.getChildren().add(new Text(text)); 
     hbox.setStyle("-fx-border-color: red;"); 
     return hbox ; 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

:

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.geometry.Bounds; 
import javafx.scene.Scene; 
import javafx.scene.layout.HBox; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class TextBorderExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     final HBox root = new HBox(5); 
     final Text red = new Text("Red"); 
     final Rectangle redBorder = new Rectangle(0, 0, Color.TRANSPARENT); 
     redBorder.setStroke(Color.RED); 
     redBorder.setManaged(false); 
     red.boundsInParentProperty().addListener(new ChangeListener<Bounds>() { 

      @Override 
      public void changed(ObservableValue<? extends Bounds> observable, 
        Bounds oldValue, Bounds newValue) { 
       redBorder.setLayoutX(red.getBoundsInParent().getMinX()); 
       redBorder.setLayoutY(red.getBoundsInParent().getMinY()); 
       redBorder.setWidth(red.getBoundsInParent().getWidth()); 
       redBorder.setHeight(red.getBoundsInParent().getHeight()); 
      } 

     }); 
     root.getChildren().addAll(new Text("This"), new Text("Is"), new Text("A"), red, new Text("Bordered"), new Text("Text")); 
     root.getChildren().add(redBorder); 


     primaryStage.setScene(new Scene(root)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

감사합니다. boundsInParentProperty가 핵심이었습니다. 나는 위치가 부모의 위치이고 현장이 아니라는 점에서 여전히 작은 문제를 가지고있다. 그러나 나는 그것이 지금 고치는 것은 꽤 사소한 것이라고 생각한다. –