2016-08-16 1 views
0

У меня есть кнопка с именем add new user, нажав, чтобы появилось всплывающее окно, содержащее дополнительную форму пользователя. Вот моя функция для этой кнопки:добавить форму в pop up stage (Customize Stage content)

public void btnAddeNewClicked(){ 


     final TextField name = new TextField() ; 
     final TextField addr = new TextField() ; 
     final TextField wp = new TextField() ; 
     final TextField state = new TextField() ; 
     final TextField loginName = new TextField() ; 
     final Label labelUsername = new Label(); 
     final Label labelAddress = new Label(); 
     final Label labelWebPage = new Label(); 
     final Label labelState = new Label(); 
     final Label labelloginName = new Label(); 
     final Button btn = new Button("Add"); 


     Stage dialog = new Stage(); 
     dialog.initStyle(StageStyle.UTILITY); 
     Scene scene = new Scene(btn); 
     dialog.setScene(scene); 
     dialog.show(); 


} 

проблема, я не знаю, как добавить свою форму в моей сцене. Любая помощь сильно ценится :)

ответ

2

Используйте любой из layout, чтобы добавить содержимое своего всплывающего окна. Позже добавьте этот макет в качестве корня сцены.

В следующем примере я использовал GridPane.

import javafx.application.Application; 
import javafx.geometry.HPos; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 
import javafx.stage.StageStyle; 

public class Main extends Application { 

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

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     Button button = new Button("Show Popup"); 
     button.setOnAction(e -> btnAddeNewClicked()); 
     Scene scene = new Scene(new StackPane(button), 200, 200); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public void btnAddeNewClicked(){ 

     final TextField name = new TextField() ; 
     final TextField addr = new TextField() ; 
     final TextField wp = new TextField() ; 
     final Label labelUsername = new Label("Username"); 
     final Label labelAddress = new Label("Address"); 
     final Label labelWebPage = new Label("Web Page"); 
     final Button btn = new Button("Add"); 

     GridPane gridPane = new GridPane(); 
     gridPane.setVgap(10); 
     gridPane.setHgap(10); 
     gridPane.setPadding(new Insets(10)); 

     gridPane.add(labelUsername, 0, 0); 
     gridPane.add(name, 1, 0); 
     gridPane.add(labelAddress, 0, 1); 
     gridPane.add(addr, 1, 1); 
     gridPane.add(labelWebPage, 0, 2); 
     gridPane.add(wp, 1, 2); 
     gridPane.add(btn, 0, 3, 2, 1); 
     GridPane.setHalignment(btn, HPos.CENTER); 

     Stage dialog = new Stage(); 
     dialog.initStyle(StageStyle.UTILITY); 
     Scene scene = new Scene(gridPane); 
     dialog.setScene(scene); 
     dialog.show(); 
    } 
} 

ВЫВОД

enter image description here

1

Выберите подходящий макет Parent, чтобы добавить Node с. Есть много возможностей, так что я просто продемонстрировать это с очень простым: VBox, который просто ставит места всех детей в вертикальном ряде:

final TextField name = new TextField() ; 
final TextField addr = new TextField() ; 
final TextField wp = new TextField() ; 
final TextField state = new TextField() ; 
final TextField loginName = new TextField() ; 
final Label labelUsername = new Label(); 
final Label labelAddress = new Label(); 
final Label labelWebPage = new Label(); 
final Label labelState = new Label(); 
final Label labelloginName = new Label(); 
final Button btn = new Button("Add"); 

VBox root = new VBox(); 
root.getChildren().addAll(name, 
          addr, 
          wp, 
          state, 
          loginName, 
          labelUsername, 
          labelAddress, 
          labelWebPage, 
          labelState, 
          labelloginName, 
          btn); 

Stage dialog = new Stage(); 
dialog.initStyle(StageStyle.UTILITY); 
Scene scene = new Scene(root); 
dialog.setScene(scene); 
dialog.show(); 

Следует отметить, что эти макеты могут быть использованы как дети других макеты тоже, если требуется более сложный макет. Использование SceneBuilder может быть проще для новичков, но вы должны знать, как макеты позиционируют детей независимо. Легко видеть, что отношения child-parent в полученном файле fxml воспроизводят один и тот же макет в Java-коде.