2016-11-06 35 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

擴展'Pane'或它的子類中的一個。您需要將文本和橢圓添加到節點。 –

+0

當我用Pane或StackPane擴展它並將其添加爲窗格的一個子項時,它拒絕顯示? ( –

+0

)因爲你仍然**沒有添加形狀和文本到窗格爲什麼你省略了'getChildren()。addAll(...)'?行 –

回答

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

我試過這個實現,當我運行我的程序並將其添加到窗格時,它不會顯示出來,當我將它添加到場景中時,它也不會顯示出來。 –