基本上我想在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对我没用,所以我想在javafx中使用tabpane这样的解决方案。
答案 0 :(得分:0)
实施起来可能不是那么容易和优雅,但你可以尝试一下。你需要某种单身类。如果需要线程安全等,可以更改实际的单例实现。
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创建的按钮,那么你需要在FXML中给它们fx:id
并在控制器类中获取它们的注入引用。
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());
}
要更改大小,只需调用单例类中的方法(例如ButtonSizeManager.largeSize()
)
答案 1 :(得分:0)
您可以根据大小向根名称添加样式类,并使用CSS样式表来修改按钮的大小,例如通过修改-fx-font-size
属性:
@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
的属性see JavaFX CSS Reference Guide也有可用的属性。但请注意,如果您通过内联CSS(Node.style
)设置属性或从代码设置相应的属性(例如Button.setPrefWidth
),则不会应用这些值。