2015-06-14 57 views
4

我試圖在javafx中創建一個自定義的工具欄。該工具欄應該能夠在其表面的中心,左側和右側(三個部分)顯示控件。 問題是,我不知道要實現這一點。我讀了很多有關這個問題的提示,但他們不爲我工作,或者我做錯了什麼...如何用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.It工程爲左,右部分,但如何定義中心嗎?

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

    看看[這篇文章](http://stackoverflow.com/a/30826914/1759128)。您可以用各自的控件替換帖子中的ImageView,Image和VBox。 – ItachiUchiha

    回答

    3

    只需使用一個HBox中,而不是StackPane。 StackPane將節點放在彼此的頂部。

    See a modified example of your third attempt.

    另一種選擇是使用FX工具欄中,類似於如何已經提到jewelsea

    See an example using a ToolBar.

    嘗試都應該是足夠靈活的滿足您的需求。它們的差異在於您對佈局的控制程度以及您可以從標準ToolBar繼承的功能數量。

    +0

    下面看到我的回答感謝您的有用的例子!我試圖擴展FX工具欄的方法,它完美的作品:) – Qbisiek

    5

    ToolBar截面對齊的彈簧方法對我來說很好。

    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(至少在標準modena.css樣式的Java 8),已經在內部實現爲HBox容器,所以可以只使用HBox.setHgrow方法來調整內部您放置在工具欄中的項目的佈局約束。

    本例中的左側和右側墊片實現爲空白窗格,這些窗格只會隨着可用空間的增大和縮小而變化。

    如果你想要一個間隔,而不是HBox.setHgrow這是一個固定的大小,你可以使用類似:

    leftSpacer.setPrefSize(20); 
    leftSpacer.setMinSize(HBox.USE_PREF_SIZE); 
    leftSpacer.setMaxSize(HBox.USE_PREF_SIZE); 
    
    +0

    感謝您的支持。我將您的解決方案改編爲FXML。在 – burntblark

    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> 
    
    相關問題