2016-05-04 58 views
0

JavaFXでボタンのグリッドを作成しました。
グリッドを内側にしてウィンドウのサイズを変更すると、グリッド内でボタンのサイズも変更されます。
問題は、これらのボタンのテキストは彼らと一緒にサイズを変更しないということである:それは同じ大きさのすべての時間のままなので、ボタンが大きく成長したときに、空きスペースの多くは、ボタンの上にあります、その後、小さな真ん中に小さなテキストがあり、ひどいです。
私はむしろ、自動的にユーザーインターフェイス全体が大きくなったときに、ボタンのテキストが同様に大きくなっているので、空きスペースに合わせてこれらのボタンと一緒にサイズを変更するテキストたいと思います。
どうすれば実現できますか?JavaFXのボタンでボタンのテキストを自動的に拡大する

CSSスタイルシートの-fx-font-sizeをパーセント値に設定しようとしましたが、ウェブサイトと同じように機能していないようです:テキストはコンテナのパーセンテージではなく、いくつかの定義済みのテキストサイズ。

編集
これはない重複しています!重複して各質問に印を付けるのをやめてください!それが答えられたら、私はそれを最初に尋ねなかったでしょう!

最初のスレッドは、の新しく作成されたボタンのテキストのサイズ/スタイルをコンテナの現在のサイズなどを考慮して設定したいという状況でした。 がすでに作成されているボタンをに作成して、これらのボタンが何らかの形でコンテナ内でサイズ変更されたときにテキストのサイズを自動的に変更するようにしたいからです。

他のスレッドは、予め設定されたフォントサイズのルートコンテナ/ウィンドウと一緒にテキストをスケーリング程度でした。これは私がテキストがでスケーリングすることにしたくないので、また、私は必要なものと異なっているが、ボタン自身のサイズで。また、ボタンの大きさに常に合うように、一定の方法でスケーリングする必要があります。あなたは知っている:テキストは同じままだが、ボタンの内側に常に収まるように伸びる(小さなパディングで、テキストの周りには巨大な空白ではない)。

ボタンのサイズです。これは、ウィンドウやコンテナなどではなく、テキストのサイズを決定するためのもので、ボタン自体によって自動的に行われる必要があります(組み込みのものまたはサブクラス化されたもの)、これらのすべてのボタンを反復処理してテキストのサイズを更新する(それはやり方が間違っています)手動ではありません。

+0

これはhttp://stackoverflow.com/questions/34812022/javafx-automatically-resize-buttons-font-size-to-fit-inまたはhttp://stackoverflow.com/questions/23705654と重複している可能性があります。/bind-font-size-in-javafx – hotzst

+0

重複や潜在的なクローズのためだけではなく、実際に質問に回答した人が増えれば、これらの昔のことをStackOverflowで再現することができます。私自身に尋ねる。そこに解決策が見つかったら、私は最初に質問しません。 (私がそれらのスレッドで何かを逃していない限り) – SasQ

+0

ボタンのサイズを固定したボタンのサイズと一致するように、ボタンのフォントサイズを設定することと、ボタンのサイズが変わったときにフォントサイズを更新することの違いは何ですか?同じことをするように?私は申し訳ありません:私は本当に*どのようにそれらが異なるものであるか見ることができません。 (その解決策は特に素晴らしいですが、それでも...まったく些細な点を除いて、地球上でどう違うのですか?) –

答えて

2

これは、リンクされた質問、ハックの何かを言っています。しかし、ボタン内のテキストノードをスケーリングの代わりに、フォントサイズを変更することを検討してください。これは、[OK]を動作するようです:同様の効果を得るために

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Priority; 
import javafx.stage.Stage; 

public class ScaledButtons extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     GridPane root = new GridPane(); 
     root.setHgap(5); 
     root.setVgap(5); 
     for (int i = 1; i <= 9 ; i++) { 
      root.add(createScaledButton(Integer.toString(i)), (i-1) % 3, (i-1)/3); 
     } 
     root.add(createScaledButton("#"), 0, 3); 
     root.add(createScaledButton("0"), 1, 3); 
     root.add(createScaledButton("*"), 2, 3); 

     primaryStage.setScene(new Scene(root, 250, 400)); 
     primaryStage.show(); 
    } 

    private Button createScaledButton(String text) { 
     Button button = new Button(text); 
     GridPane.setFillHeight(button, true); 
     GridPane.setFillWidth(button, true); 
     GridPane.setHgrow(button, Priority.ALWAYS); 
     GridPane.setVgrow(button, Priority.ALWAYS); 

     button.layoutBoundsProperty().addListener((obs, oldBounds, newBounds) -> 
      scaleButton(button)); 

     button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE); 

     return button ; 
    } 

    private void scaleButton(Button button) { 
     double w = button.getWidth(); 
     double h = button.getHeight(); 

     double bw = button.prefWidth(-1); 
     double bh = button.prefHeight(-1); 

     if (w == 0 || h == 0 || bw == 0 || bh == 0) return ; 

     double hScale = w/bw ; 
     double vScale = h/bw ; 

     double scale = Math.min(hScale, vScale); 

     button.lookup(".text").setScaleX(scale); 
     button.lookup(".text").setScaleY(scale); 
    } 

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

うーん、面白いです。ボタンの中にテキストノードがあることはわかりませんでした。それはどこかに文書化されていますか? – SasQ

+0

私はそれがCSSドキュメントで文書化されていると思っていました。 –

0

代替アプローチはcom.sun.javafx.scene.control.skin.ButtonSkinをサブクラス化し、肌の親(LabeledSkinBase)からlayoutLabelInArea(double x, double y, double w, double h, Pos alignment)メソッドをオーバーライドすることができます。更新されたスキンをボタンに明示的に割り当てることができます(CSSまたはJava APIコール経由)。

そうだろう行うには、その後のJavaFXのリリースで予告なしに変更される可能性com.sun APIをサブクラス化する必要があります。また、layoutLabelInAreaは操作上かなり複雑ですので、レイアウトロジックを変更するのはややこしいかもしれません。確かに、この特定のケースでは、リスナーに基づくテキストのリサイズ操作をレイアウト境界プロパティに適用するというJamesの提案は簡単です。

私は必ずしもこのアプローチを主張しているわけではありません。目標を達成するためのルートを提供するだけです。「ボタンのサイズは、テキストのサイズではなく、ウィンドウやコンテナなどで、ボタン自体によって自動的に行われる必要があります」。

+0

Java 9では、スキンクラスはパブリックAPIです。 –

関連する問題