1

以下のコードでは、ツールバーがあり、それにさまざまなサイズのボタンを追加しています。ボタンは正方形で、すべて同じサイズにしたいと思います。基本的に、すべてのボタンから最も長い幅または高さを見つけ、他のすべてのボタンの幅と高さをこのサイズに設定します。ただ、ボタンのサイズは変えられるので、バインディングは必要だと思います。私はそれを完全に把握することはできません - 誰かがそれを行う方法を知っていますか?

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class ToolBarButtonTest extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        BorderPane borderPane = new BorderPane();
        Scene scene = new Scene(borderPane, 500, 500);

        ToolBar toolBar = new ToolBar();

        Button button1 = new Button("s");
        Button button2 = new Button("ss");
        Button button3 = new Button("sss");

        toolBar.getItems().addAll(button1, button2, button3);

        borderPane.setTop(toolBar);

        stage.setScene(scene);
        stage.show();
    }

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

ありがとう、ニック。

4

2 に答える 2

2

どうぞ。この例では、CSS を使用してボタンの形状を正方形に変え、検証リスナーをインストールしてボタンのレイアウト変更を追跡し、それに応じて幅を更新します。

public class SquareButtons extends Application {
@Override
  public void start(final Stage stage) throws Exception {
    /* Assume these are your toolbar elements */
    final Button[] buttons = new Button[]{
            new Button("Short"),
            new Button("Slightly longer"),
            new Button("Very very very long button")
    };

    /* This would, of course, belong in a style sheet - it turns the buttons square */
    for (Button b : buttons)
        b.setStyle("-fx-background-radius: 0");

    /* This will set the pref width/height of all your buttons to the maximum of the pref width/height of the larget one */
    final InvalidationListener listener = new InvalidationListener() {
        public void invalidated(final Observable observable) {
            double size = 0;
            for (Button b : buttons) {
                size = Math.max(size, b.prefWidth(Integer.MAX_VALUE));
                size = Math.max(size, b.prefHeight(Integer.MAX_VALUE));
            }

            for (Button b : buttons) {
                b.setPrefWidth(size);
                b.setPrefHeight(size);
            }
        }
    };

    for (Button b : buttons)
        b.widthProperty().addListener(listener);

    final ToolBar toolbar = new ToolBar();
    toolbar.getItems().addAll(buttons);

    final Scene scene = new Scene(toolbar);
    stage.setScene(scene);
    stage.setWidth(800);
    stage.setHeight(200);
    stage.show();
  }

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

更新:質問を十分に読んでいませんでした。コメントを参照してください。

于 2013-03-16T23:03:53.603 に答える
0

他に誰も回答していないので、部分的な解決策をお伝えします。私はJavaFXの初心者ですが、親が子ノードのレイアウトを担当しているため、ToolBarクラスの修正バージョンを派生させ、レイアウトコードの一部をオーバーライドします。これは、動作する例の修正ですが、少し不器用です。

package toolbarbuttontest;

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class ToolBarButtonTest extends Application {

    @Override
    public void start(Stage stage) {
        BorderPane borderPane = new BorderPane();
        Scene scene = new Scene(borderPane, 500, 500);

        Button btn1 = new Button("short");
        Button btn2 = new Button("between");
        Button btn3 = new Button("pretty long");

        SquareButtonToolBar toolBar = new SquareButtonToolBar();
        toolBar.getItems().addAll(btn1, btn2, btn3);

        borderPane.setTop(toolBar);

        stage.setScene(scene);
        stage.show();
        toolBar.requestLayout();
    }

    // A derivative of the ToolBar class that will resize all buttons to be
    // the same size (based on the length of the longest button label) and
    // square.
    class SquareButtonToolBar extends ToolBar {

        @Override
        protected void layoutChildren() {
            double minPrefSize = calculatePrefChildSize();
            for (Node n : getItems()) {
                if (n instanceof Button) {
                    ((Button) n).setPrefWidth(minPrefSize);
                    ((Button) n).setPrefHeight(minPrefSize);
                }
            }
            super.layoutChildren();
        }

        private double calculatePrefChildSize() {
            double minPrefSize = 0.0d;
            for (Node n : getItems()) {
                if (n instanceof Button) {
                    minPrefSize = Math.max(minPrefSize, n.prefWidth(-1));
                }
            }
            return minPrefSize;
        }

    }

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

このSquareButtonToolBarクラスは、ボタンの適切な幅と高さを最も長いボタンの長さに設定することでレイアウト コードをオーバーライドし、すべてのボタンを正方形で同じサイズにします。toolBar.requestLayout()クラッジは、メソッドの下部にある呼び出しstartです。この呼び出しがないと、プログラムの起動時にボタンの幅がすべて希望どおりに表示されていても、ウィンドウのサイズが変更されるまで高さが正しく表示されません。自分に何が欠けているのかわからない。答えが見つかったら、更新を投稿してください。

更新:例を完全に機能するように変更しましたが、厄介な問題があります。

于 2013-03-16T22:02:43.700 に答える