在JavaFX 2中设置ToolBar Buttons square和所有相同的大小

时间:2013-03-15 15:44:24

标签: java javafx-2

在下面的代码中,我有一个ToolBar,我添加了各种大小的按钮。我希望按钮是方形的,大小相同。所以基本上从所有按钮中找到最长的宽度或高度,并将所有其他按钮宽度和高度设置为此大小。但是,按钮可以改变大小,所以我想要一个绑定。我无法弄清楚 - 有谁知道怎么做?

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);
    }
}

谢谢,尼克。

2 个答案:

答案 0 :(得分: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);
  }
}

更新:没有彻底阅读问题,请参阅评论。

答案 1 :(得分: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类通过将按钮的首选宽度和高度设置为最长按钮的长度来覆盖布局代码,从而使所有按钮都是正方形且大小相同。 kludge是toolBar.requestLayout()方法底部start的调用。如果没有此调用,即使在程序启动时按钮宽度都显示为所需,在窗口重新调整大小之前,高度也不会正确显示。不知道我自己错过了什么。如果您找到答案,请发布更新。

更新:修改了一个完全正常工作的示例,但是有一个讨厌的kludge。