GridPane可以水平/垂直填充整个舞台

时间:2013-11-12 01:25:39

标签: java eclipse user-interface javafx-2

这就是我的布局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();

我遗漏了我认为不必要的代码。谢谢!

3 个答案:

答案 0 :(得分:4)

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

enter image description here

在这里你保持你想要增加的一面。也是由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");
        }
    }); 

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

答案 1 :(得分:1)

技巧在于模糊的行和列约束,这对我来说是

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));
    }

答案 2 :(得分:-1)

现在使用它..完美的工作......你必须设置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);
}

}