java 字符串像素_如何在JavaFX中计算字符串的像素宽度?

如果仅在没有CSS的情况下测量默认字体,请执行以下操作:

将要测量的字符串放在Text对象中。

获取Text对象的布局范围的宽度。

如果您需要应用CSS:

将要测量的字符串放在Text对象中。

创建一个一次性场景并将Text对象放置在场景中。

拍摄文本快照(如果您使用的是Java 7),或者为Java 8 调用applyCss。

获取Text对象的布局范围的宽度。

之所以可行,是因为它会强制在Text上进行布局传递,以计算其布局范围。需要步骤2中的场景,因为这只是CSS处理器的工作方式(它需要一个节点位于Scene中才能执行其工作)。如果您想进一步了解处理过程,请绝对阅读适用于applyCss的链接Javadoc。

样例代码

import javafx.application.Application;

import javafx.scene.Scene;

import javafx.scene.control.*;

import javafx.scene.text.Text;

import javafx.stage.Stage;

// displays the width in pixels of an arbitrary piece of text.

public class MeasureText extends Application {

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

@Override public void start(Stage stage) throws Exception {

final Text text = new Text("XYZZY");

new Scene(new Group(text));

// java 7 =>

//    text.snapshot(null, null);

// java 8 =>

text.applyCss();

final double width = text.getLayoutBounds().getWidth();

stage.setScene(new Scene(new Label(Double.toString(width))));

stage.show();

}

}

示例程序输出(显示任意文本的宽度(以像素为单位)):

示例程序输出

如果将文本以设置的字体打印到图形上下文中,这将如何(如果有的话)发生变化?

将字体应用于包含与绘图相同的消息的文本对象。与测量在场景图上绘制的文本不同,在画布上绘制的项目没有应用CSS,因此在测量文本之前,无需将Text对象放置在场景中并对其应用CSS。您可以测量文本对象的布局范围,它与使用相同字体在画布内绘制的文本的范围相同。

import javafx.application.Application;

import javafx.scene.Scene;

import javafx.scene.canvas.*;

import javafx.scene.control.Label;

import javafx.scene.layout.VBox;

import javafx.scene.text.*;

import javafx.stage.Stage;

// displays the width in pixels of an arbitrary piece of text (which has been plotted on a canvas).

public class MeasureText extends Application {

@Override

public void start(Stage stage) throws Exception {

final String msg = "XYZZY";

final Text text = new Text(msg);

Font font = Font.font("Arial", 20);

text.setFont(font);

final double width = text.getLayoutBounds().getWidth();

Canvas canvas = new Canvas(200, 50);

GraphicsContext gc = canvas.getGraphicsContext2D();

gc.setFont(font);

gc.fillText(msg, 0, 40);

stage.setScene(new Scene(

new VBox(new Label(Double.toString(width)), canvas))

);

stage.show();

}

public static void main(String[] args) {

launch(args);

}

}

下面是一个简单的JavaFX代码,可以模拟风扇的转动效果: ```java import javafx.animation.Animation; import javafx.animation.RotateTransition; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Arc; import javafx.scene.shape.Circle; import javafx.stage.Stage; import javafx.util.Duration; public class FanSimulation extends Application { @Override public void start(Stage primaryStage) { // 创建一个圆形 Circle circle = new Circle(150, 150, 100); circle.setFill(Color.TRANSPARENT); circle.setStroke(Color.BLACK); // 创建三个扇形 Arc arc1 = new Arc(150, 150, 80, 80, 0, 30); arc1.setType(ArcType.ROUND); arc1.setFill(Color.RED); arc1.setStroke(Color.BLACK); Arc arc2 = new Arc(150, 150, 80, 80, 90, 30); arc2.setType(ArcType.ROUND); arc2.setFill(Color.BLUE); arc2.setStroke(Color.BLACK); Arc arc3 = new Arc(150, 150, 80, 80, 180, 30); arc3.setType(ArcType.ROUND); arc3.setFill(Color.GREEN); arc3.setStroke(Color.BLACK); // 创建一个面板并添加圆形和扇形 Pane pane = new Pane(); pane.getChildren().addAll(circle, arc1, arc2, arc3); // 创建一个旋转动画 RotateTransition rotateTransition = new RotateTransition(Duration.seconds(2), pane); rotateTransition.setByAngle(360); rotateTransition.setCycleCount(Animation.INDEFINITE); rotateTransition.play(); // 创建一个场景并将面板添加到场景 Scene scene = new Scene(pane, 300, 300); // 将场景添加到舞台并显示舞台 primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } ``` 上述代码创建了一个圆形和三个扇形,然后将它们添加到面板。接着创建一个旋转动画,并将面板添加到动画,最后将面板添加到场景并显示舞台。运行程序后,将会看到一个旋转的风扇。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值