如何一次将多个对象添加到网格窗格

时间:2016-05-11 05:00:28

标签: java javafx

我大多只是这样做,试图加快一些繁琐的办公任务。

到目前为止,我已创建了GridPane我想要的内容,我想复制该设置并将其直接复制到现有GridPane下面。

现在它有点工作。它复制LabelTextField就好了,但它将它们全部放在一列而不是复制我已经制作的布局。我认为它不会起作用,因为没有列/行索引被更新。我不明白为什么它会把它全部放在一个专栏中。

如果有人能指出我正确的方向让这项工作变得非常棒。

package application;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
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.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.stage.Screen;

public class Main extends Application {

    Label   sample, USCS, ColorField, DensityLabel, MoistureField,
            startElevationField, endElevationField, BlowCount6Field,
            BlowCount12Field, BlowCount18Field, LabTestField,
            SamplerTypeField;

    TextField   sampleTextField, USCSTextField, ColorTextField,
                DensityTextField, MoistureTextField,
                startElevationTextField, endElevationTextField,
                BlowCount6TextField, BlowCount12TextField,
                BlowCount18TextField, LabTestTextField,
                SamplerTypeTextField;

    int rowMod, columnMod;

    GridPane grid;

    Scene scene;

    Button btn;


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

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Boring Logger+");
        createGrid();
        scene = new Scene(grid, 900, 600);
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public GridPane createGrid(){
        grid = new GridPane();
        grid.setAlignment(Pos.TOP_LEFT);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));

        sample = new Label("Sample Label");
        grid.add(sample, 0, 3);
        sample.setPrefWidth(150);
        sample.setAlignment(Pos.CENTER);

        sampleTextField = new TextField();
        grid.add(sampleTextField, 0, 4);

        USCS = new Label("USCS");
        grid.add(USCS, 1, 0);
        USCS.setPrefWidth(150);
        USCS.setAlignment(Pos.CENTER);

        USCSTextField = new TextField();
        grid.add(USCSTextField, 1, 1);

        ColorField = new Label("Color");
        grid.add(ColorField, 2, 0);
        ColorField.setPrefWidth(150);
        ColorField.setAlignment(Pos.CENTER);

        ColorTextField = new TextField();
        grid.add(ColorTextField, 2, 1);

        DensityLabel = new Label("Density");
        grid.add(DensityLabel, 3, 0);
        DensityLabel.setPrefWidth(150);
        DensityLabel.setAlignment(Pos.CENTER);

        DensityTextField = new TextField();
        grid.add(DensityTextField, 3, 1);

        MoistureField = new Label("Moisture");
        grid.add(MoistureField, 4, 0);
        MoistureField.setPrefWidth(150);
        MoistureField.setAlignment(Pos.CENTER);

        MoistureTextField = new TextField();
        grid.add(MoistureTextField, 4, 1);

        startElevationField = new Label("Start Elevation");
        grid.add(startElevationField, 1, 3);
        startElevationField.setPrefWidth(150);
        startElevationField.setAlignment(Pos.CENTER);

        startElevationTextField = new TextField();
        grid.add(startElevationTextField, 1, 4);

        endElevationField = new Label("End Elevation");
        grid.add(endElevationField, 2, 3);
        endElevationField.setPrefWidth(150);
        endElevationField.setAlignment(Pos.CENTER);

        endElevationTextField = new TextField();
        grid.add(endElevationTextField, 2, 4);

        BlowCount6Field = new Label("Blow Count @ 6in");
        grid.add(BlowCount6Field, 3, 3);
        BlowCount6Field.setPrefWidth(150);
        BlowCount6Field.setAlignment(Pos.CENTER);

        BlowCount6TextField = new TextField();
        grid.add(BlowCount6TextField, 3, 4);

        BlowCount12Field = new Label("Blow Count @ 12in");
        grid.add(BlowCount12Field, 4, 3);
        BlowCount12Field.setPrefWidth(150);
        BlowCount12Field.setAlignment(Pos.CENTER);

        BlowCount12TextField = new TextField();
        grid.add(BlowCount12TextField, 4, 4);

        BlowCount18Field = new Label("Blow Count @ 18in");
        grid.add(BlowCount18Field, 1, 5);
        BlowCount18Field.setPrefWidth(150);
        BlowCount18Field.setAlignment(Pos.CENTER);

        BlowCount18TextField = new TextField();
        grid.add(BlowCount18TextField, 1, 6);

        LabTestField = new Label("Lab Test?");
        grid.add(LabTestField, 2, 5);
        LabTestField.setPrefWidth(150);
        LabTestField.setAlignment(Pos.CENTER);

        LabTestTextField = new TextField();
        grid.add(LabTestTextField, 2, 6);

        SamplerTypeField = new Label("Sampler Type");
        grid.add(SamplerTypeField, 3, 5);
        SamplerTypeField.setPrefWidth(150);
        SamplerTypeField.setAlignment(Pos.CENTER);

        SamplerTypeTextField = new TextField();
        grid.add(SamplerTypeTextField, 3, 6);

        Button();
        return grid;
    }

    public void Button(){
        //Add new Grid Button
        btn = new Button("Add Sample");
        grid.add(btn, 4, 6);
        btn.setPrefWidth(150);
        final GridPane actiontarget = new GridPane();
        grid.add(actiontarget, 1, 7);

        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                actiontarget.add(createGrid(), 0, 0, 4, 6);
            }

//            @Override
//            public void handle(ActionEvent e) {
//                actiontarget.setFill(Color.FIREBRICK);
//                actiontarget.setText("Sign in button pressed");
//            }
        });
    }
}

2 个答案:

答案 0 :(得分:1)

在下面的变体中,createGrid()会返回您的布局副本,createButton()会返回一个按钮,将副本添加到封闭的grid中,该ScrollPane本身包含在{{1}中}}。单击添加样本按钮以查看效果。请注意,因为标签和文本字段是成员变量,所以它们仅引用最近创建的网格。您必须重构它们才能满足您的应用目标。

image

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

/**
 * @se http://stackoverflow.com/a/37154103/230513
 */
public class Main extends Application {

    Label sample, USCS, ColorField, DensityLabel, MoistureField,
        startElevationField, endElevationField, BlowCount6Field,
        BlowCount12Field, BlowCount18Field, LabTestField,
        SamplerTypeField;

    TextField sampleTextField, USCSTextField, ColorTextField,
        DensityTextField, MoistureTextField,
        startElevationTextField, endElevationTextField,
        BlowCount6TextField, BlowCount12TextField,
        BlowCount18TextField, LabTestTextField,
        SamplerTypeTextField;

    int rowMod, columnMod;

    GridPane grid = new GridPane();
    private int row;

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

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Boring Logger+");
        grid.add(createGrid(), 0, row);
        ScrollPane sp = new ScrollPane(grid);
        sp.setHbarPolicy(ScrollBarPolicy.NEVER);
        sp.setVbarPolicy(ScrollBarPolicy.ALWAYS);
        BorderPane bp = new BorderPane(sp);
        HBox hbox = new HBox(createButton());
        hbox.setAlignment(Pos.CENTER_RIGHT);
        bp.setBottom(hbox);
        Scene scene = new Scene(bp);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public GridPane createGrid() {
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.TOP_LEFT);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));

        sample = new Label("Sample Label");
        grid.add(sample, 0, 3);
        sample.setPrefWidth(150);
        sample.setAlignment(Pos.CENTER);

        sampleTextField = new TextField();
        grid.add(sampleTextField, 0, 4);

        USCS = new Label("USCS");
        grid.add(USCS, 1, 0);
        USCS.setPrefWidth(150);
        USCS.setAlignment(Pos.CENTER);

        USCSTextField = new TextField();
        grid.add(USCSTextField, 1, 1);

        ColorField = new Label("Color");
        grid.add(ColorField, 2, 0);
        ColorField.setPrefWidth(150);
        ColorField.setAlignment(Pos.CENTER);

        ColorTextField = new TextField();
        grid.add(ColorTextField, 2, 1);

        DensityLabel = new Label("Density");
        grid.add(DensityLabel, 3, 0);
        DensityLabel.setPrefWidth(150);
        DensityLabel.setAlignment(Pos.CENTER);

        DensityTextField = new TextField();
        grid.add(DensityTextField, 3, 1);

        MoistureField = new Label("Moisture");
        grid.add(MoistureField, 4, 0);
        MoistureField.setPrefWidth(150);
        MoistureField.setAlignment(Pos.CENTER);

        MoistureTextField = new TextField();
        grid.add(MoistureTextField, 4, 1);

        startElevationField = new Label("Start Elevation");
        grid.add(startElevationField, 1, 3);
        startElevationField.setPrefWidth(150);
        startElevationField.setAlignment(Pos.CENTER);

        startElevationTextField = new TextField();
        grid.add(startElevationTextField, 1, 4);

        endElevationField = new Label("End Elevation");
        grid.add(endElevationField, 2, 3);
        endElevationField.setPrefWidth(150);
        endElevationField.setAlignment(Pos.CENTER);

        endElevationTextField = new TextField();
        grid.add(endElevationTextField, 2, 4);

        BlowCount6Field = new Label("Blow Count @ 6in");
        grid.add(BlowCount6Field, 3, 3);
        BlowCount6Field.setPrefWidth(150);
        BlowCount6Field.setAlignment(Pos.CENTER);

        BlowCount6TextField = new TextField();
        grid.add(BlowCount6TextField, 3, 4);

        BlowCount12Field = new Label("Blow Count @ 12in");
        grid.add(BlowCount12Field, 4, 3);
        BlowCount12Field.setPrefWidth(150);
        BlowCount12Field.setAlignment(Pos.CENTER);

        BlowCount12TextField = new TextField();
        grid.add(BlowCount12TextField, 4, 4);

        BlowCount18Field = new Label("Blow Count @ 18in");
        grid.add(BlowCount18Field, 1, 5);
        BlowCount18Field.setPrefWidth(150);
        BlowCount18Field.setAlignment(Pos.CENTER);

        BlowCount18TextField = new TextField();
        grid.add(BlowCount18TextField, 1, 6);

        LabTestField = new Label("Lab Test?");
        grid.add(LabTestField, 2, 5);
        LabTestField.setPrefWidth(150);
        LabTestField.setAlignment(Pos.CENTER);

        LabTestTextField = new TextField();
        grid.add(LabTestTextField, 2, 6);

        SamplerTypeField = new Label("Sampler Type");
        grid.add(SamplerTypeField, 3, 5);
        SamplerTypeField.setPrefWidth(150);
        SamplerTypeField.setAlignment(Pos.CENTER);

        SamplerTypeTextField = new TextField();
        grid.add(SamplerTypeTextField, 3, 6);

        return grid;
    }

    public Button createButton() {
        Button btn = new Button("Add Sample");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                grid.add(createGrid(), 0, ++row);
            }
        });
        return btn;
    }
}

答案 1 :(得分:1)

您需要重新考虑布局:您的createGrid()方法会为您创建整个网格,这很好。您需要做的就是将此网格添加到另一个容器(如VBox - 我认为没有必要在此使用另一个GridPane)。因此,应用以下修改:

...
private final VBox mainLayout = new VBox();  // was GridPane grid;
...

在start方法中,创建第一个网格并将其添加到您也设置为Scene的顶级节点的主布局中:

...
GridPane grid1 = createGrid();
mainLayout.getChildren().add(grid1);
scene = new Scene(mainLayout, 900, 600);
...

在按钮动作处理程序中,您只需创建另一个网格并将其添加到主布局。完全删除actiontarget变量 - 您不需要创建另一个网格。

然后,您需要将按钮添加到网格中 - 最简单的方法是将目标网格作为参数传递给Button方法(这假定按钮应在每个网格上可用)。此外,该方法应重命名为createButton()。完整的方法现在看起来像这样:

public void createButton(GridPane grid){
    //Add new Grid Button
    btn = new Button("Add Sample");
    btn.setPrefWidth(150);
    grid.add(btn, 1, 7);

    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            GridPane newGrid = createGrid();
            mainLayout.getChildren().add(newGrid); // actiontarget.add(createGrid(), 0, 0, 4, 6);
        }
    });
}