如何在javaFX中创建左,中,右部分的工具栏?
我正在尝试在javafx中创建自定义工具栏。 此工具栏应该能够在其表面的中心,左侧和右侧(三个部分)显示控件。 问题是我不知道这个问题。 我读了很多与这个问题有关的提示,但是他们不适合我,或者我做错了什么……
无论如何,我写了几个方法,它们代表了实现我的工具栏的不同方法,但没有一个正常工作。 在这里你有我的尝试:
-
使用HBox Hgrow属性作为弹簧。 没工作。
public ToolBar createToolBar() { ToolBar toolBar = new ToolBar(); Pane emptyPane = new Pane(); HBox spring = new HBox(emptyPane); spring.setHgrow(emptyPane, Priority.ALWAYS); toolBar.getItems().addAll(spring, new Label("LABEL")); return toolBar; }
2.它适用于左右两部分,但如何定义中心部分?
public AnchorPane createToolBar2() { AnchorPane toolBar = new AnchorPane(); Label leftLabel = new Label("left"); Label rightLabel = new Label("right"); toolBar.getChildren().addAll(leftLabel, rightLabel); toolBar.setLeftAnchor(leftLabel, 0.0); toolBar.setRightAnchor(rightLabel, 0.0); return toolBar; }
-
这种方法适用于布局,但我无法监听左侧和中间部分的事件,因为这些事件由右侧部分覆盖(StackPane是原因),因此该解决方案也没用。
public StackPane createToolBar3() { StackPane toolBar = new StackPane(); Button left = new Button("left button"); Button right = new Button("right button"); Button center = new Button("center button"); HBox leftSection = new HBox(left); leftSection.setAlignment(Pos.CENTER_LEFT); HBox centerSection = new HBox(center); centerSection.setAlignment(Pos.CENTER); HBox rightSection = new HBox(right); rightSection.setAlignment(Pos.CENTER_RIGHT); toolBar.getChildren().addAll(leftSection, centerSection, rightSection); left.setOnAction(event -> System.out.println("left")); right.setOnAction(event -> System.out.println("right")); center.setOnAction(event -> System.out.println("center")); return toolBar; }
我正在该代码块中调用的上述方法:
@Override public void start(Stage stage) { BorderPane borderPane = new BorderPane(); borderPane.setPrefWidth(500); borderPane.setPrefHeight(300); borderPane.setTop(createToolBar4()); stage.setScene(new Scene(borderPane)); stage.show(); }
对此,我将不胜感激。
只需使用HBox而不是StackPane。 StackPane将节点放在彼此之上。
查看第三次尝试的修改示例。
另一种选择是使用FX ToolBar,类似于jewelsea已经提到的:
请参阅使用ToolBar的示例。
两种尝试都应该足够灵活,以满足您的需求。 它们的不同之处在于您对布局的控制程度以及您可以从标准ToolBarinheritance的function数量。
ToolBar部分对齐的Spring方法对我来说很好。
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.*; import javafx.stage.Stage; public class SectionalToolbar extends Application { @Override public void start(Stage stage) throws Exception { final Pane leftSpacer = new Pane(); HBox.setHgrow( leftSpacer, Priority.SOMETIMES ); final Pane rightSpacer = new Pane(); HBox.setHgrow( rightSpacer, Priority.SOMETIMES ); final ToolBar toolBar = new ToolBar( new Button("Good"), new Button("Boys"), leftSpacer, new Button("Deserve"), new Button("Fruit"), rightSpacer, new Button("Always") ); toolBar.setPrefWidth(400); BorderPane layout = new BorderPane(); layout.setTop(toolBar); stage.setScene( new Scene( layout ) ); stage.show(); } public static void main(String[] args) { launch(); } }
ToolBar (至少在Java 8的标准modena.css样式表中)已经在内部实现为HBox容器,因此您可以使用HBox.setHgrow方法调整放置在工具栏中的项目的内部布局约束。
此示例中的左侧和右侧间隔器实现为空白窗格,其将仅增长和缩小以适合可用空间。
如果你想要一个固定大小的垫片,而不是HBox.setHgrow,你可以使用类似的东西:
leftSpacer.setPrefSize(20); leftSpacer.setMinSize(HBox.USE_PREF_SIZE); leftSpacer.setMaxSize(HBox.USE_PREF_SIZE);
将FXML与@jewelsea结合使用。