2016-05-03 11 views
1

だから、私はテキストエリアで構成されて動的UI、に取り組んできたのJavaFXのTextAreaの幅を調整しますが、事はテキストエリアへの入力は、データベースから来るので、異なる長さであるということです。また、データベースからの文字列の長さに応じてTextAreasダイナミックを作成する必要があります。これは難しい作業です。文字列の長さがピクセル単位で自動的に長さを表すわけではないからです。 したがって、例えば、文字列の:は自動的

A) "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"

B) "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM"

これら二つの文字列は70個の文字から成るが、ピクセル単位で、その長さは完全に異なっています。 そして、TextAreaの幅が文字列の長さ(ピクセル単位)に基づいていることを確認する必要があります。

私はこのようなものを使用することを試みた:

int textwidth = (int) font.getStringBounds(ta.getText(), frc).getWidth(); 

をしかし、フォントは次のようであるので、それは私にエラーを与える:

textLabel.getFont() 
-> Font[name=System Regular, family=System, style=Regular, size=12.0] 

しかし、以前getStringBounds方法でこのフォントを使用して私にエラーが表示されます:

Cannot resolve method 'getStringBounds(java.lang.String, java.awt.font.FontRenderContext)' 

いずれかのヘルプは非常にappriciatedされます。必要に応じてさらに情報を提供することができます。

ありがとうございます!

+0

AWTの 'Font'クラスとJavaFX' Font'クラスを混同しているようです。単にある[いいえ方法](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/text/Font.html)と呼ばれる 'getStringBounds()'。 –

+0

さて、ありがとう!それはおそらくそうかもしれない、はい、私は思う。しかし、私は何をすべきか、そしてどのようにすべきかについて何か提案がありますか? –

答えて

3

Textオブジェクトを作成し、ペインに配置して(StackPaneなど)ペインでlayout()を呼び出して、テキストのレイアウト範囲を取得して、テキストのサイズを測定できます。テキスト領域で使用するフォントと同じフォントにフォントを設定します。

ザ・唯一残っている問題は、テキストエリアにはなど、その境界線のいくつかのパディングを必要とすることで、次のコード例は、単に(試行錯誤を経て設立)は、固定パディングを使用していますが、十分に機能します。必要に応じてこれを改善できます。テキストフィールドに何かを入力し、Enterを押します

タイプ。

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class SizeTextAreaToString extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     TextField enterField = new TextField(); 
     TextArea textArea = new TextArea(); 
     textArea.setPrefRowCount(1); 

     enterField.setOnAction(e -> sizeTextAreaToText(textArea, enterField.getText())); 

     VBox root = new VBox(5, enterField, textArea); 
     VBox.setVgrow(textArea, Priority.NEVER); 
     root.setPadding(new Insets(5)); 
     primaryStage.setScene(new Scene(root, 400, 400)); 
     primaryStage.show(); 
    } 

    private void sizeTextAreaToText(TextArea textArea, String text) { 
     Text t = new Text(text); 
     t.setFont(textArea.getFont()); 
     StackPane pane = new StackPane(t); 
     pane.layout(); 
     double width = t.getLayoutBounds().getWidth(); 
     double padding = 20 ; 
     textArea.setMaxWidth(width+padding); 
     textArea.setText(text); 
    } 

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

ありがとう!私は今日/明日にそれを試してみましょう、あなたに知らせてください! –

+0

Somewhy「t.setFont(textArea.getFont());」でエラーが発生しました。 メソッド 'getFont()'を解決できません –