сделать иконку равной ширине - PullRequest
0 голосов
/ 07 июня 2018

По сути, я хочу изменить размер всей кнопки до одного размера при щелчке в Javafx.

@FXML
private void OnClickResize(ActionEvent event) {
    VBox vBox = new VBox();

    vBox.setPrefWidth(300);

    //Button btn1 = new Button("Short");
    //Button btn2 = new Button("Super Long Button");

    btn_preview.setMaxWidth(vBox.getPrefWidth());
    btn_pdf_preview.setMaxWidth(vBox.getPrefWidth());
    btn_bilingualfile.setMaxWidth(vBox.getPrefWidth());

    btn_close.setMaxWidth(vBox.getPrefWidth());

    vBox.getChildren().addAll(btn_preview,btn_pdf_preview,btn_bilingualfile,btn_close);
}

Но это для vbox, а vbox для меня бесполезен, поэтому я хочу такое решение tabpane в javafx.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы можете добавить класс стиля к корневому имени в зависимости от размера и использовать таблицу стилей CSS для изменения размера кнопок, например, изменив свойство -fx-font-size:

style.css

@Override
public void start(Stage primaryStage) throws Exception {
    ComboBox<String> combo = new ComboBox<>();
    combo.getItems().addAll("small", "medium", "large");
    combo.setValue("medium");

    VBox root = new VBox(combo);
    root.getStyleClass().add("medium");

    combo.valueProperty().addListener((o, oldValue, newValue) -> {
        root.getStyleClass().removeAll(combo.getItems());
        root.getStyleClass().add(newValue);
    });

    for (int i = 0; i < 7; i++) {
        root.getChildren().add(new Button("button " + i));
    }

    Scene scene = new Scene(root);
    scene.getStylesheets().add(getClass().getResource("style.css").toExternalForm());
    primaryStage.setScene(scene);
    primaryStage.show();
}
.small .button {
    -fx-font-size: 8;
}

.medium .button {
}

.large .button {
    -fx-font-size: 20;
}

Есть также свойства, доступные для многих свойств Button, см. Справочное руководство по JavaFX CSS .Однако обратите внимание, что эти значения не будут применены, если вы устанавливаете свойство через встроенный CSS (Node.style) или устанавливаете соответствующее свойство из кода (например, Button.setPrefWidth).

0 голосов
/ 07 июня 2018

Это может быть не очень легко и элегантно реализовать, но вы можете попробовать это.Вам нужен какой-то класс синглтона.Вы можете изменить фактическую реализацию синглтона, если вам нужно, чтобы она была поточно-ориентированной и т. Д.

public class ButtonSizeManager {
    private ButtonSizeManager instance;

    private ButtonSizeManager() {}

    public static final ButtonSizeManager getInstance() {
        if (instance == null) instance = new ButtonSizeManager();

        return instance;
    }

    private static final double LARGE_WIDTH = 100;
    private static final double LARGE_HEIGHT = 30;
    /* Similar constants for medium and small sizes */

    private final ReadOnlyDoubleWrapper width = new ReadOnlyDoubleWrapper(); 
    private final ReadOnlyDoubleWrapper height = new ReadOnlyDoubleWrapper();

    public final void largeSize() {
        width.set(LARGE_WIDTH);
        height.set(LARGE_WIDTH);
    }

    /* Similar methods for medium and small */

    public final ReadOnlyDoubleProperty widthProperty() {
        return width.getReadOnlyProperty();
    }
    public final double getWidth() { this.width.get(); }

    public final ReadOnlyDoubleProperty heightProperty() {
        return height.getReadOnlyProperty();
    }
    public final double getHeight() { this.height.get(); }
}

Тогда все ваши кнопки (да, это будет утомительно) будут привязаны к этому.Это означает, что если у вас есть кнопки, созданные из FXML, вам нужно дать им fx:id в FXML и получить их введенную ссылку в классе контроллера.

public class Controller {
    @FXML private Button foo;

    public void initialize() {
        foo.setMinWidth(Region.USE_PREF_SIZE);
        foo.setMinHeight(Region.USE_PREF_SIZE);
        foo.setMaxWidth(Double.MAX_VALUE);
        foo.setMaxHeight(Double.MAX_VALUE);

        foo.prefWidthProperty.bind(ButtonSizeManager.getInstance().widthProperty());
        foo.prefHeightProperty.bind(ButtonSizeManager.getInstance().heightProperty());
    }
}

Если вы не хотите делать так много длякаждой кнопкой, затем вы можете переместить некоторые коды в ButtonSizeManager.

public final bindButtonSize(Button button) {
    Objects.requireNonNull(button);

    button.setMinWidth(Region.USE_PREF_SIZE);
    button.setMinHeight(Region.USE_PREF_SIZE);
    button.setMaxWidth(Double.MAX_VALUE);
    button.setMaxHeight(Double.MAX_VALUE);

    button.prefWidthProperty.bind(widthProperty());
    button.prefHeightProperty.bind(heightProperty());
}

Чтобы изменить размер, просто вызовите метод в классе singleton (например, ButtonSizeManager.largeSize())

...