我试图在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();
}
我将非常感谢你提供任何帮助。
答案 0 :(得分:7)
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);
答案 1 :(得分:3)
只需使用HBox而不是StackPane。 StackPane将节点放在彼此之上。
See a modified example of your third attempt.
另一种选择是使用FX工具栏,类似于jewelsea已经提到过的方式:
See an example using a ToolBar.
两种尝试都应该足够灵活,以满足您的需求。它们的不同之处在于您对布局的控制程度以及您可以从标准ToolBar继承的功能数量。
答案 2 :(得分:0)
将FXML与@jewelsea一起使用。
<ToolBar prefHeight="40.0" prefWidth="200.0">
<items>
<Button mnemonicParsing="false" text="Good" />
<Button mnemonicParsing="false" text="Boys" />
<Pane prefWidth="20.0" HBox.hgrow="SOMETIMES" />
<Button mnemonicParsing="false" text="Deserve" />
<Button mnemonicParsing="false" text="Fruit" />
<Pane prefWidth="20.0" HBox.hgrow="SOMETIMES" />
<Button mnemonicParsing="false" text="Always" />
<Pane prefWidth="20.0" HBox.hgrow="SOMETIMES" />
</items>
</ToolBar>