2016-03-15 7 views
3

Я хочу выровнять i.e Position CENTER кнопку OK диалогового окна. Я попробовал приведенный ниже код, но не работал.Как выровнять кнопку «Окно диалога» в Javafx?

Dialog dialog = new Dialog(); 
DialogPane dialogPane = dialog.getDialogPane(); 
dialogPane.setStyle("-fx-background-color: #fff;"); 

     // Set the button types. 
ButtonType okButtonType = new ButtonType("Ok", ButtonBar.ButtonData.OK_DONE); 
ButtonType cancelButtonType = new ButtonType("Cancel", ButtonBar.ButtonData.CANCEL_CLOSE); 
dialog.getDialogPane().getButtonTypes().addAll(okButtonType, cancelButtonType); 
dialogPane.lookupButton(cancelButtonType).setVisible(false); 

     // Testing 
Button okButton = (Button) dialog.getDialogPane().lookupButton(okButtonType); 
okButton.setAlignment(Pos.CENTER); 
     // End Testing 

dialog.showAndWait(); 
+0

кнопку Ok виден в правом нижнем угле диалогового окна, которое является его функцией по умолчанию, но я хочу, чтобы это было показано в нижней части центр диалога. –

+0

Пожалуйста, используйте ссылку [edit], чтобы добавить дополнительную информацию к вопросу. Благодаря! (И, пожалуйста, сделайте код полной программой - это поможет людям воспроизвести то, что вы сделали, и дать вам хороший ответ). См. [Help], как написать [mcve]. –

ответ

2

Кнопки центрирования в ButtonBar диалогового окна на самом деле на удивление трудно достичь не-хакерским способом.

Ниже представлено лучшее решение, которое я мог бы придумать. Он полагается на dynamic CSS lookup HBox для контейнера кнопок, к которому он затем добавляет спейсерную область справа, чтобы нажимать кнопки влево (по умолчанию реализация ButtonSkin уже помещает неявный разделитель слева, который нажимает кнопки на правый, который я определил с помощью ScenicView). Сочетание левого и правого прокладок выравнивает кнопки в центре. Решение также отменяет создание ButtonBar, чтобы остановить внутреннее переупорядочение ButtonSkin и выполнить дополнительную компоновку кнопок, поскольку, когда это происходит, вы не можете надежно настраивать макет самостоятельно.

centered button

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 

import java.util.Optional; 

public class CenteredDialogButtons extends Application { 
    @Override 
    public void start(Stage stage) { 
     Button show = new Button("Show Dialog"); 

     Dialog<ButtonType> dialog = new Dialog<>(); 
     DialogPane dialogPane = new DialogPane() { 
      @Override 
      protected Node createButtonBar() { 
       ButtonBar buttonBar = (ButtonBar) super.createButtonBar(); 
       buttonBar.setButtonOrder(ButtonBar.BUTTON_ORDER_NONE); 

       return buttonBar; 
      } 
     }; 
     dialog.setDialogPane(dialogPane); 
     dialogPane.getButtonTypes().addAll(ButtonType.OK); 
     dialogPane.setContentText("Centered Button"); 

     Region spacer = new Region(); 
     ButtonBar.setButtonData(spacer, ButtonBar.ButtonData.BIG_GAP); 
     HBox.setHgrow(spacer, Priority.ALWAYS); 
     dialogPane.applyCss(); 
     HBox hbox = (HBox) dialogPane.lookup(".container"); 
     hbox.getChildren().add(spacer); 

     show.setOnAction(e -> { 
      Optional<ButtonType> result = dialog.showAndWait(); 
      if (result.isPresent() && result.get() == ButtonType.OK) { 
       System.out.println("OK"); 
      } 
     }); 

     StackPane layout = new StackPane(
       show 
     ); 
     layout.setPadding(new Insets(50)); 

     Scene scene = new Scene(layout); 

     stage.setScene(scene); 
     stage.show(); 
    } 

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

Причина мне не совсем нравится это решение является то, что динамические CSS поиски рода нарушают API инкапсуляция, как CSS структуры графов сцены JavaFX для управления, такие как кнопки баров не являются частью их публичного API. Тем не менее, я не думаю, что действительно можно получить центрированные кнопки в ButtonBar, используя существующие общедоступные API для JavaFX 8 и скина ButtonBar по умолчанию.

Альтернативным подходом было бы создание пользовательского скина для ButtonBar, связанного с диалоговым окном, но этот подход довольно сложный, и я бы не рекомендовал его для этой задачи.

В принципе, вынос из всего этого, просто оставляйте макет кнопки по умолчанию и заказывайте диалоговые окна, когда можете, а не пытаетесь настроить макет диалогового окна. Если вы хотите, чтобы полностью настраиваемый макет был на уровне таких вещей, как размещение кнопок, то вам может быть лучше просто создать собственный собственный класс диалога с помощью подкласса Stage, а не основывать свою собственную реализацию диалогового окна на встроенном диалоговом классе.

Связанных, но немного другая информация находится в:

0

Это своего рода хак, но вы могли бы просто сделать что-то вроде этого:

okButton.translateXProperty().bind(okButton.prefWidthProperty().divide(-2)); 

DialogPane является горизонтальным по центру, так вычитание половины ширины кнопки OK будет делать трюк. Но я думаю, что это действительно грязное решение ;-)

Смежные вопросы