2016-11-06 7 views
0

自分のペインに追加できるオブジェクトを作成しようとしています。 このオブジェクトにはShapeとテキストが含まれます。呼び出してJavaFX:図形とテキストを使ってオブジェクトを作成する

pane#getChildren()#add(new TextEllipse(...)) 

それは、参照ペインに中央にテキストの楕円を追加します。

このようなオブジェクトのための私のクラスが下に表され

public class TextEllipse extends ShapeEllipse { 

     public TextEllipse(final String text, final double x, final double y) { 
      super(text, x, y); 
     } 
@Override 
    protected Shape createShape() { 
     final double PADDING = 10; 
     final Ellipse ellipse = new Ellipse(); 
     ellipse.setRadiusX(getText().getLayoutBounds().getWidth()/2 + PADDING); 
     ellipse.setRadiusY(10); 
     ellipse.setStroke(Color.BLACK); 
     ellipse.setFill(Color.WHITE); 
     return ellipse; 
    } 
    } 


public abstract class TextShape extends Pane { 
    private final Text text; 
    private final Shape shape; 

    public TextShape(final String text, final double x, final double y) { 
     this.text = new Text(x, y, text); 
     shape = createShape(); 
    } 

    protected abstract Shape createShape(); 

    public Text getText() { 
     return text; 
    } 

    public Shape getBackgroundShape() { 
     return shape; 
    } 
} 

私が続いてきたD.J.しかし、ブラウンの方法 - 私が呼び出すとき

pane#getChildren()#add(new TextEllipse(...)) 

キャンバスには何も表示されません。

しかし、私が行うとき:

pane#getChildren()#add(new TextEllipse(...)#getBackgroundShape()) 

楕円が現れるん。

TextEllipseオブジェクトを追加するだけで楕円やテキストが表示されないのはなぜですか?

+1

に動作します。ノードにテキストと楕円を追加する必要があります。 –

+0

私はそれをPaneまたはStackPaneで拡張し、それをペインの子の1つとして追加すると、表示を拒否しますか? :( –

+0

)あなたはまだ形状とテキストをペインに追加していないので、なぜ 'getChildren()。addAll(...) 'という行を省略しましたか? –

答えて

1

これは `Pane`またはそのサブクラスの1つを拡張

public class TextEllipse extends StackPane{ 
    private final Ellipse bubble; 
    private final Text text; 

    TextEllipse(String text, double x, double y) 
    {    
     this.text = new Text(x, y, text); 
     System.out.println(this.text.getBoundsInLocal().getWidth()); 
     bubble = new Ellipse (x, y, this.text.getBoundsInLocal().getWidth() + 5, 15); 
     bubble.setFill(Color.YELLOW); 
     getChildren().addAll(bubble, this.text); 
    } 
} 

enter image description here

1

これを達成する簡単な方法は、StackPaneを使用することです。例えば

(と、それは簡単に再利用可能にするために)、あなたは、例えば、具体的なTextShapeを実装次にStackPane

public abstract class TextShape extends StackPane { 

    private final Text text; 
    private final Shape shape; 

    public TextShape(final String t) { 
     text = new Text(t); 
     shape = createShape();   
     getChildren().addAll(shape, text); 
    } 

    abstract protected Shape createShape(); 

    public Text getText() { 
     return text; 
    } 

    public Shape getBackgroundShape() { 
     return shape; 
    }   

} 

を拡張する抽象TextShapeクラスを定義することができますファクトリメソッドをオーバーライドすることによりTextEllipse

public class TextEllipse extends TextShape { 

    public TextEllipse(final String t) { 
     super(t); 
    } 

    @Override 
    protected Shape createShape() { 
     final double PADDING = 10; 
     Ellipse ellipse = new Ellipse(); 
     ellipse.setRadiusX(getText().getLayoutBounds().getWidth()/2 + PADDING); 
     ellipse.setRadiusY(getText().getLayoutBounds().getHeight()/2 + PADDING); 
     ellipse.setStroke(Color.BLACK); 
     ellipse.setFill(Color.WHITE); 
     return ellipse; 
    }   
} 

使用例:

public class Example extends Application { 
    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Scene scene = new Scene(new TextEllipse("Hello World")); 
     primaryStage.setScene(scene); 
     primaryStage.setTitle("Example"); 
     primaryStage.setResizable(false); 
     primaryStage.sizeToScene(); 
     primaryStage.show();  
    } 
} 
+0

私はこの実装を試しましたが、プログラムを実行してペインに追加すると、表示されません。シーンに追加すると表示されません。 –

関連する問題