【问题标题】:GridPane to horizontally/vertically fill the whole StageGridPane 水平/垂直填充整个舞台
【发布时间】:2013-11-24 00:22:17
【问题描述】:

这就是我的布局看起来像with gridlines,这就是它看起来像when I resize 主窗口,这就是我想要的final result。基本上,我需要一些技巧来让我的 GridPane 水平和/或垂直填充整个舞台,同时它的一些单元格保持指定的宽度/高度。我已经尝试了目前我能想到的一切,但仍然找不到解决方案。使用 AnchorPane 可能会帮助我实现想要的结果,但我仍在试图弄清楚如何。我不想使用 SceneBuilder,因为我不是“拖放”编程的忠实粉丝 =)

@Override
public void start(final Stage primaryStage){
    BorderPane border = new BorderPane();
    GridPane grid = new GridPane();

    grid.getColumnConstraints().add(new ColumnConstraints(70));     //column 1
    grid.getColumnConstraints().add(new ColumnConstraints());       //column 2
    grid.getColumnConstraints().add(new ColumnConstraints(70));     //column 3
    grid.getColumnConstraints().add(new ColumnConstraints(100));    //column 4
    grid.getColumnConstraints().add(new ColumnConstraints());       //column 5
    grid.getColumnConstraints().add(new ColumnConstraints());       //column 6
    grid.getColumnConstraints().add(new ColumnConstraints());       //column 7
    grid.getColumnConstraints().add(new ColumnConstraints());       //column 8

    grid.setVgap(10);
    grid.setHgap(5);
    grid.setPadding(new Insets(20,20,20,20));
    grid.setGridLinesVisible(false);

    Button btnDownload = new Button("Download next");
    Label lblDownloadNext = new Label("next download in");
    Label lblTimer = new Label("03:21");
    VBox vboxTimer = new VBox();
    vboxTimer.setAlignment(Pos.CENTER);
    vboxTimer.getChildren().addAll(lblDownloadNext,lblTimer);
    Label lblTimer.setId("timer");
    Button btnStop = new Button("STOP");
    Button btnStop.setMaxWidth(Double.MAX_VALUE);

    grid.add(btnDownload, 0, 0, 2, 1);
    grid.add(vboxTimer, 2, 0, 5, 1);
    grid.add(btnStop, 7, 0);

    Label lblCSVPath = new Label("CSV path:");
    TextField txtCSVPath = new TextField("Select a CSV/TXT file");
    txtCSVPath.setId("csvpath");
    txtCSVPath.setEditable(false);
    Button btnCSVBrowse = new Button("Browse");
    Button btnCSVParse = new Button("Parse");
    btnCSVParse.setMaxWidth(Double.MAX_VALUE);
    grid.add(lblCSVPath, 0, 1);
    grid.add(txtCSVPath, 1, 1, 5, 1);
    grid.add(btnCSVBrowse, 6, 1);
    grid.add(btnCSVParse, 7, 1);

    Label lblOutput = new Label("Save to:");
    TextField txtOutputPath = new TextField("Select Output folder");
    txtOutputPath.setId("outputpath");
    txtOutputPath.setEditable(false);
    Button btnOutputBrowse = new Button("Browse");
    btnOutputBrowse.setMaxWidth(Double.MAX_VALUE);
    grid.add(lblOutput, 0, 2);
    grid.add(txtOutputPath, 1, 2, 6, 1);
    grid.add(btnOutputBrowse, 7, 2);

    TableView<CSVData> tblDoi = new TableView<CSVData>();
    tblDoi.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
    TableColumn columnDoi = new TableColumn("DOI URL");
    TableColumn columnUt = new TableColumn("UT");
    columnUt.setMinWidth(135);
    columnUt.setMaxWidth(175);
    tblDoi.getColumns().addAll(columnDoi, columnUt);
    grid.add(tblDoi, 0, 3, 8, 2);

    Label lblArticlesDownloaded = new Label("count");
    Label lblArticlesDownloadedCount = new Label("0");
    lblArticlesDownloadedCount.setId("downloadedCount");
    VBox vboxDownloaded = new VBox();
    vboxDownloaded.setAlignment(Pos.TOP_CENTER);
    vboxDownloaded.getChildren().addAll(lblArticlesDownloaded, lblArticlesDownloadedCount);
    Label lblArticlesLeft = new Label("left");
    Label lblArticlesLeftCount = new Label("0");
    lblArticlesLeftCount.setId("leftCount");
    VBox vboxLeft = new VBox();
    vboxLeft.setAlignment(Pos.TOP_CENTER);
    vboxLeft.getChildren().addAll(lblArticlesLeft, lblArticlesLeftCount);
    Label lblArticlesTotal = new Label("total");
    Label lblArticlesTotalCount = new Label("0");
    lblArticlesTotalCount.setId("totalCount");
    VBox vboxTotal = new VBox();
    vboxTotal.setAlignment(Pos.TOP_CENTER);
    vboxTotal.getChildren().addAll(lblArticlesTotal, lblArticlesTotalCount);

    Button btnStart = new Button("START");
    btnStart.setMaxWidth(Double.MAX_VALUE);
    Button btnExit = new Button("EXIT");
    btnExit.setMaxWidth(Double.MAX_VALUE);
    grid.add(vboxDownloaded, 0, 5, 1, 1);
    grid.add(vboxLeft, 1, 5);
    grid.add(vboxTotal, 2, 5);
    grid.add(btnStart, 3, 5, 3, 1);
    grid.add(btnExit, 6, 5, 2, 1);

    MenuBar menuBar = new MenuBar();
    Menu menuView = new Menu("View");
    CheckMenuItem menuViewWebViewItem = new CheckMenuItem("Show WebView");
    CheckMenuItem menuViewConsole = new CheckMenuItem("Show Console");
    menuView.getItems().addAll(menuViewWebViewItem, menuViewConsole);
    menuBar.getMenus().add(menuView);

    HBox menuBox = new HBox();
    menuBox.getChildren().add(menuBar);
    HBox.setHgrow(menuBar, Priority.ALWAYS);

    HBox gridBox = new HBox();
    gridBox.getChildren().add(grid);
    gridBox.setAlignment(Pos.CENTER);

    border.setTop(menuBox);
    border.setCenter(gridBox);

    Scene scene = new Scene(border, 500, 600);
    scene.getStylesheets().add(Main.class.getResource("application.css").toExternalForm());
    primaryStage.setTitle("Science Direct PDF Downloader");
    primaryStage.setScene(scene);
    primaryStage.setResizable(true);
    primaryStage.setMinWidth(500);
    primaryStage.setMinHeight(400);
    primaryStage.show();

我忽略了我认为不必要的代码。谢谢!

【问题讨论】:

    标签: java eclipse user-interface javafx-2


    【解决方案1】:

    我认为这会对您有所帮助。 您可以在Scene Builder 的帮助下进行整理。首先,您需要为网格窗格设置约束。在下图中,您可以通过设置它们来制作。根据你的说法。

    这里你维护你想要增加的那一面。它也是由fxml完成​​的。

     <GridPane AnchorPane.bottomAnchor="-15.0" AnchorPane.leftAnchor="161.0" AnchorPane.rightAnchor="270.0" AnchorPane.topAnchor="30.0">
    

    这里 AnchorPane.bottomAnchor="-15.0" 这是主要位置,现在它们在窗口调整大小时分散...

    如果您想更改元素中的某些内容。您可以使用网格窗格的 withProperty()。它是这样的。

    GridPane pne  =new GridPane();
        pne.widthProperty().addListener(new ChangeListener<Number>
        () {
    
            @Override
            public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
                System.out.println("now do here what you want with inner objects");
            }
        }); 
    

    通过使用这些属性,您还可以更改网格窗格的内部元素和其他属性。

    【讨论】:

    • 我可能遗漏了一些东西,但是创建一个新的 AnchorPane 并将我的 Grid 添加到它并设置 AnchorPane.setLeftAnchor(grid, 50.0); AnchorPane.setRightAnchor(grid, 50.0); AnchorPane.setTopAnchor(grid, 50.0); AnchorPane.setBottomAnchor(grid, 50.0) 给我留下了 this。所以,GridPane 仍然没有水平/垂直填充整个 AnchorPane。
    • 好的,但我如何以编程方式做到这一点? grid.setPrefSize(width, height); 不做任何事情。我可以让 GridPane 将 SceneBuilder 中的整个 AnchorPane 填充为seen here
    • @E.Normous 以编程方式由 widthProperty() 发生,如上所示..您在此处添加您的条件。但如果您使用场景构建器,我会建议它更好,因为它的工具非常轻巧并且提供可靠性......现在由您决定。如果您喜欢我的回答,请投票。如果您对 widhtProperty 有进一步的疑问,可以写信给我 :)
    • 我想我还是会使用 SceneBuilder,真可惜。感谢您的建议!
    【解决方案2】:

    诀窍在于晦涩的行和列约束,这是为我做的

    for(int row = 0; row < 4; row++) {
            messageButtonGrid.getRowConstraints().add( 
                    new RowConstraints(Region.USE_COMPUTED_SIZE, 
                            Region.USE_COMPUTED_SIZE, 
                            Region.USE_COMPUTED_SIZE, 
                            Priority.SOMETIMES, 
                            VPos.TOP, 
                            true));
        }
    

    【讨论】:

      【解决方案3】:

      现在使用它..它完美的工作...你必须设置 AnchorPane.setLeftAnchor(grid, 0.0); AnchorPane.setRightAnchor(grid, 0.0); AnchorPane.setTopAnchor(grid, 0.0); AnchorPane.setBottomAnchor(grid, 0.0); 现在,当您调整锚窗格的大小时。网格窗格也会调整大小..

      package tableviewsample;
      import javafx.application.Application;
      import javafx.event.ActionEvent;
      import javafx.event.EventHandler;
      import javafx.scene.Scene;
      import javafx.scene.control.Button;
      import javafx.scene.layout.AnchorPane;
      import javafx.scene.layout.GridPane;
      import javafx.scene.layout.StackPane;
      import javafx.stage.Stage;
      
      public class NewFXMain extends Application {
      
      @Override
      public void start(Stage primaryStage) {
      
      
          AnchorPane root = new AnchorPane();
          root.setStyle("-fx-background-color:pink");
          GridPane gp = new GridPane();
          gp.setMinHeight(250);
          gp.setMinWidth(300);
      
          gp.setStyle("-fx-background-color:red");
          root.setLeftAnchor(gp, 0.0);
          root.setRightAnchor(gp, 0.0);
          root.setTopAnchor(gp,0.0);
          root.setBottomAnchor(gp, 0.0);
          root.getChildren().add(gp);
      
      
          Scene scene = new Scene(root, 300, 250);
      
          primaryStage.setTitle("Hello World!");
          primaryStage.setScene(scene);
          primaryStage.show();
      }
      
      /**
       * The main() method is ignored in correctly deployed JavaFX application.
       * main() serves only as fallback in case the application can not be
       * launched through deployment artifacts, e.g., in IDEs with limited FX
       * support. NetBeans ignores main().
       *
       * @param args the command line arguments
       */
      public static void main(String[] args) {
          launch(args);
      }
      

      }

      【讨论】:

      • 向 AnchorPane 添加一些节点时,GridPane 仍然不会填充宽度/高度。比如this is what I get当我gp.setGridLinesVisible(true); gp.add(new Label("label"), 0, 0); gp.add(new Button("button"), 0, 1);。我想要实现的是something like this,但是以编程方式。我想我应该坚持使用 SceneBuilder,因为我认为没有其他方式可以实现这一点。
      猜你喜欢
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      相关资源
      最近更新 更多