【问题标题】:how to put a text into a circle object to display it from circle's center?如何将文本放入圆形对象以从圆形中心显示?
【发布时间】:2013-06-30 12:26:44
【问题描述】:

我很好奇是否有任何方法可以将文本(我通常使用会动态变化的数字)放入圆形对象或创建文本对象并将其边界设置为圆形的中心是唯一的显示方式它?我会感谢每一个回应:)

【问题讨论】:

    标签: javafx-2 javafx


    【解决方案1】:

    将圆圈和文本放在 StackPane 中,并将文本边界类型计算设置为 VISUAL:

    Circle circle = new Circle();
    Text text = new Text("42");
    text.setBoundsType(TextBoundsType.VISUAL); 
    StackPane stack = new StackPane();
    stack.getChildren().add(circle, text);
    

    您可以使用时间轴来更改圆圈中文本的值。

    这是一个完整的例子:

    import javafx.animation.*;
    import javafx.application.Application;
    import javafx.event.*;
    import javafx.scene.*;
    import javafx.scene.layout.StackPane;
    import javafx.scene.paint.Color;
    import javafx.scene.shape.*;
    import javafx.scene.text.*;
    import javafx.stage.Stage;
    import javafx.util.Duration;
    
    public class TextInCircle extends Application {
        public static void main(String[] args) throws Exception { launch(args); }
    
        private static final int R = 150;
        private static final Color lineColor = Color.FIREBRICK.deriveColor(0, 1, 1, .6);
    
        @Override
        public void start(final Stage stage) throws Exception {
            final Circle circle = createCircle();
            final Text   text   = createText();
    
            final Line l1 = createLine(lineColor, 0, R - 0.5, 2 * R, R - 0.5);
            final Line l2 = createLine(lineColor, R - 0.5, 0, R - 0.5, 2 * R);
    
    //        Group group = new Group(circle, text, l1 , l2);
            Group group = new Group(circle, l1 , l2);
    
            StackPane stack = new StackPane();
            stack.getChildren().addAll(group, text);
    
            stage.setScene(new Scene(stack));
            stage.show();
    
            animateText(text);
        }
    
        private Circle createCircle() {
            final Circle circle = new Circle(R);
    
            circle.setStroke(Color.FORESTGREEN);
            circle.setStrokeWidth(10);
            circle.setStrokeType(StrokeType.INSIDE);
            circle.setFill(Color.AZURE);
            circle.relocate(0, 0);
    
            return circle;
        }
    
        private Line createLine(Color lineColor, double x1, double y1, double x2, double y2) {
            Line l1 = new Line(x1, y1, x2, y2);
    
            l1.setStroke(lineColor);
            l1.setStrokeWidth(1);
    
            return l1;
        }
    
        private Text createText() {
            final Text text = new Text("A");
    
            text.setFont(new Font(30));
            text.setBoundsType(TextBoundsType.VISUAL);
    //        centerText(text);
    
            return text;
        }
    
        private void centerText(Text text) {
            double W = text.getBoundsInLocal().getWidth();
            double H = text.getBoundsInLocal().getHeight();
            text.relocate(R - W / 2, R - H / 2);
        }
    
        private void animateText(final Text text) {
            Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), new EventHandler<ActionEvent>() {
                @Override public void handle(ActionEvent actionEvent) {
                    char newValue = (char) ((text.getText().toCharArray()[0] + 1) % 123);
                    if (newValue == 0) newValue = 'A';
                    text.setText("" + newValue);
    //                centerText(text);
                }
            }));
            timeline.setCycleCount(1000);
            timeline.play();
        }
    }
    

    注释掉的代码还包括用于手动放置文本的代码,如果您更愿意这样做而不是使用 StackPane。

    【讨论】:

    • 这正是我想要的!另一方面,我有 42 个圆圈,所以我必须创建 42 个堆栈窗格和文本对象,对吗?这看起来像是一个愚蠢的问题,但我问的是因为我不想处理凌乱的代码:)。但是感谢您的有用回答。
    • 好的,我想我解决了我的上一个问题。我将使用 SceneBuilder 手动将 42 个堆栈窗格放置在指定位置。
    • 我在圆圈内正确居中文本时遇到问题。使用 TextBoundsType.LOGICAL_VERTICAL_CENTER 对我有用。
    • @TrackerSB 这是一个很好的替代解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    相关资源
    最近更新 更多