2017-09-12 20 views
0

私は垂直線を描画したい、その垂直線がテキストオブジェクトと交差することがあります。私は何も修正せずにそのようにすると、その行は単語を右に通り、単語を読みにくくします。テキストに到達すると線が消え、テキストノードの直後に線が引かれるようにしたい。私はそれの周りに正方形を作るテキストのCSSバックグラウンドでtoBack()を使用してみましたが、テキストノードは透明な背景を持つように見えるので、行はまだ文字の後ろに表示されます。テキストが線で交差しないようにこれを行う別の方法はありますか?テキストは常に存在していてもいなくてもよく、プログラムの性質上、任意の座標にある可能性があるので、2行(テキストの前に1つ、後に1つ)を描くことはできません。ノード内の線を見ずにテキストノードと交差する線を描く方法

+0

'Zオーダー 'を設定するか、テキストオブジェクトを前面に移動できますか? – Sedrick

+0

'Text'オブジェクトの背景色を' Parent'オブジェクトの背景色と同じにしようとしましたか? – Sedrick

+1

'Text'を使う必要がありますか? 'Label'を使うことができれば、背景を不透明にすることができます。それ以外の場合は、「テキスト」を挿入することを検討することができます。 'StackPane'を呼び出し、' StackPane'に背景色を与えます。 –

答えて

1

Textの代わりにLabelを使用すると、作業が楽になります。 Labelは(最終的に)Regionのサブクラスであるため、不透明な背景を持つことを可能にする、スタイリングすることができる背景色などの特性を有する。 CSSルールを使用すると、ラベルのデフォルトの背景色になります。

-fx-background-color: -fx-background ; 

ラベルには、デフォルトの背景色が付いています。対照的に、Textは、Shapeのサブクラスであり、テキストを構成するグリフの内側と外側をそれぞれ色付けする、fillstrokeのようなプロパティしか持たない。

だからあなたが行うことができます

ラベルのテキストの周りに多くのスペースが必要な場合は、ラベルにパディングを追加できること

enter image description here

注になり

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 
import javafx.scene.shape.Line; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class TextVsLabel extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     StackPane labelPane = new StackPane(); 
     labelPane.setMinSize(250, 250); 

     Label label = new Label("A Label"); 
     label.setStyle("-fx-background-color: -fx-background;"); 

     labelPane.getChildren().add(label); 
     addLineToPane(labelPane); 

     StackPane textPane = new StackPane(); 
     textPane.setMinSize(250, 250); 
     textPane.getChildren().add(new Text("A Text")); 
     addLineToPane(textPane); 

     HBox root = new HBox(5, labelPane, textPane); 
     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void addLineToPane(Pane pane) { 
     Line line = new Line(); 
     line.startXProperty().bind(pane.widthProperty().divide(2)); 
     line.endXProperty().bind(line.startXProperty()); 
     line.setStartY(0); 
     line.endYProperty().bind(pane.heightProperty()); 

     // add line to beginning of pane's parent list, so it appears 
     // behind everything else 
     pane.getChildren().add(0, line); 
    } 

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

-fx-padding: 1em;

関連する問題