如何在javaFX中创建左,中,右部分的工具栏?

时间:2015-06-14 17:57:48

标签: java javafx alignment toolbar

我试图在javafx中创建自定义工具栏。此工具栏应该能够在其表面的中心,左侧和右侧(三个部分)显示控件。 问题是我不知道这个。我读了很多与这个问题有关的提示,但是他们不适合我,或者我做错了......

无论如何,我写了几个方法,它们代表了实现我的工具栏的不同方法,但没有一个正常工作。 在这里你有我的尝试:

  1. 使用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. 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;
        }
    
    1. 这种方法适用于布局,但我无法监听左侧和中间部分的事件,因为右侧部分涵盖了这些事件(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;
      }
      
    2. 以上方法我在该代码块中调用:

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

      我将非常感谢你提供任何帮助。

3 个答案:

答案 0 :(得分:7)

ToolBar节对齐的Spring方法对我来说很好。

springtool

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>