JavaFX:使用形状和文本制作对象

时间:2016-11-06 00:59:48

标签: java javafx

我正在尝试创建一个可以添加到我的窗格的对象。 该对象包含一个Shape和一些文本。

通过调用:

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对象,为什么不显示椭圆和文本?

2 个答案:

答案 0 :(得分:1)

实现此目的的一种简单方法是使用robin-singh-from-usa.

例如(并且为了使其易于重复使用),您可以定义一个扩展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;
    }        
}

答案 1 :(得分: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