Java FX 2.2では、テキスト文字列の幅(ピクセル単位)を計算するためのAPI呼び出しがないようです。他のフォーラムで回避策の提案がありましたが、デフォルトのフォントを使用するかどうかにかかわらず、文字列の幅を返すコードを作成または検索する私の努力は失敗しました。どんな助けでもいただければ幸いです。
4 に答える
CSS を使用せずにデフォルトのフォントを測定するだけの場合:
- 測定する String を Text オブジェクトに配置します。
- Text オブジェクトのレイアウト境界の幅を取得します。
CSS を適用する必要がある場合:
- 測定する String を Text オブジェクトに配置します。
- 使い捨てシーンを作成し、Text オブジェクトをシーンに配置します。
- Text のスナップショットを作成する (Java 7 を使用している場合) か、Java 8 のapplyCssを呼び出します。
- Text オブジェクトのレイアウト境界の幅を取得します。
これは、レイアウトの境界を計算する Text にレイアウト パスを強制するため、機能します。ステップ 2 のシーンが必要なのは、それが CSS プロセッサの動作方法だからです (ジョブを実行できるようにするには、ノードをシーン内に配置する必要があります)。処理をさらに理解したい場合は、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);
}
}
私はこれを試しました:
Text theText = new Text(theLabel.getText());
theText.setFont(theLabel.getFont());
double width = theText.getBoundsInLocal().getWidth();
そしてそれはうまくいっているようです。