2016-12-05 7 views
0

Я хочу изменить расположение каждого днище в HBox:изменение HBOX узлов позиции

HBox buttom = new HBox(); 

Button delete_button = new Button("Delete"); 
Button showAll_button = new Button("Show All"); 
Button back_button = new Button("Back"); 

buttomPaneRight_deleteScene.getChildren().addAll(back_button,showAll_button,delete_button); 

BorderPane basePane = new BorderPane(); 
basePane.setButtom(buttomPaneRight_deleteScene): 

Я хочу изменить каждое расположение кнопок, например back_button быть в левом углу и delete_button, showAll_button быть в правый угол. Я проверил setAlignment(Pos.Value);, но это изменит весь hbox pos

+1

Почему бы вам не попробовать анкерную панель вместо Hbox? или смешанные из них? – theBeacon

+0

Вы можете установить Pane на GridPane и установить ColumnConstraints в нужные позиции в GridPane, в качестве альтернативы вы можете вложить еще один HBox для своих кнопок в вашей пограничной области под первым Hbox – remedy

+1

Где вы хотите, чтобы 'deleteButton' был ? Как и другие, вы, вероятно, используете неправильную панель макета, но если вы не уточните, что именно вы хотите, трудно сказать, что это правильный. –

ответ

2

Одно решения (есть много) есть просто обернуть кнопки вы хотите в праве на другом HBox:

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Priority; 
import javafx.stage.Stage; 

public class LayoutExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     BorderPane root = new BorderPane(); 

     HBox hbox = new HBox(); 

     Button backButton = new Button("Back"); 
     Button deleteButton = new Button("Delete"); 
     Button showAllButton = new Button("Show All"); 

     HBox rightButtons = new HBox(deleteButton, showAllButton); 
     rightButtons.setAlignment(Pos.CENTER_RIGHT); 

     HBox.setHgrow(rightButtons, Priority.ALWAYS); 

     hbox.getChildren().addAll(backButton, rightButtons); 
     hbox.setPadding(new Insets(2)); 

     root.setBottom(hbox); 
     Scene scene = new Scene(root, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

enter image description here

Другим решением является добавление Pane, который действует в качестве распорки, и сделать его расти столько, сколько он может:

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.Priority; 
import javafx.stage.Stage; 

public class LayoutExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     BorderPane root = new BorderPane(); 

     HBox hbox = new HBox(); 

     Button backButton = new Button("Back"); 
     Button deleteButton = new Button("Delete"); 
     Button showAllButton = new Button("Show All"); 

     Pane spacer = new Pane(); 

     HBox.setHgrow(spacer, Priority.ALWAYS); 

     hbox.getChildren().addAll(backButton, spacer, deleteButton, showAllButton); 
     hbox.setPadding(new Insets(2)); 

     root.setBottom(hbox); 
     Scene scene = new Scene(root, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Третье решение заключается в использовании AnchorPane вместо HBox и обернуть две кнопки справа в HBox:

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.Priority; 
import javafx.stage.Stage; 

public class LayoutExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     BorderPane root = new BorderPane(); 

     AnchorPane anchorPane = new AnchorPane(); 

     Button backButton = new Button("Back"); 
     Button deleteButton = new Button("Delete"); 
     Button showAllButton = new Button("Show All"); 

     HBox rightButtons = new HBox(deleteButton, showAllButton); 

     anchorPane.getChildren().addAll(backButton, rightButtons); 

     AnchorPane.setBottomAnchor(rightButtons, 2.0); 
     AnchorPane.setBottomAnchor(backButton, 2.0); 

     AnchorPane.setLeftAnchor(backButton, 2.0); 
     AnchorPane.setRightAnchor(rightButtons, 2.0); 

     root.setBottom(anchorPane); 
     Scene scene = new Scene(root, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

И четвертым решением является использование GridPane:

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.ColumnConstraints; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Priority; 
import javafx.stage.Stage; 

public class LayoutExample extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     BorderPane root = new BorderPane(); 

     GridPane gridPane = new GridPane(); 


     Button backButton = new Button("Back"); 
     Button deleteButton = new Button("Delete"); 
     Button showAllButton = new Button("Show All"); 

     gridPane.add(backButton, 0, 0); 
     gridPane.add(deleteButton, 1, 0); 
     gridPane.add(showAllButton, 2, 0); 

     ColumnConstraints leftCol = new ColumnConstraints(); 
     leftCol.setHgrow(Priority.ALWAYS); 

     gridPane.getColumnConstraints().addAll(leftCol, new ColumnConstraints(), new ColumnConstraints()); 

     gridPane.setPadding(new Insets(2)); 
     root.setBottom(gridPane); 
     Scene scene = new Scene(root, 600, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

спасибо, что у вас всегда есть лучшее решение – MrRizk

1

В принципе не используйте HBox. AnchorPane больше подходит для того, чего вы хотите достичь.

AnchorPane holder = new AnchorPane(); 

Button delete_button = new Button("Delete"); 
Button showAll_button = new Button("Show All"); 
Button back_button = new Button("Back"); 

// Add buttons to holder 
holder.getChildren().add(delete_button); 
holder.getChildren().add(showAll_button); 
holder.getChildren().add(back_button); 

// Delete top left 
AnchorPane.setTopAnchor (delete_button, 0.0); 
AnchorPane.setLeftAnchor(delete_button, 0.0); 

// Show all top right 
AnchorPane.setTopAnchor (showAll_button, 0.0); 
AnchorPane.setRightAnchor(showAll_button, 0.0); 

// Back bottom right 
AnchorPane.setBottomAnchor(back_button, 0.0); 
AnchorPane.setRightAnchor (back_button, 0.0); 
0

Попробуйте использовать другой вариант Pane, как я уже упоминал ранее, GridPane должен решить вопрос, что или вложенности другого HBOX

См эту http://docs.oracle.com/javafx/2/layout/builtin_layouts.htm

+0

Зачем это произошло? – remedy

+0

Это больше подходит для комментария, чем для ответа. – Michael

+0

не уверен, что я не – MrRizk