简体   繁体   English

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

[英]How to add multiple objects to Grid Pane at once

I am mostly just doing this to try and speed up some tedious office tasks. 我主要只是这样做,以尝试加快一些乏味的办公任务。

So far I have created a GridPane of what I want, and I want to copy that setup and duplicate it directly below the existing GridPane . 到目前为止,我已经创建了想要的GridPane ,我想复制该设置并将其直接复制到现有GridPane下面。

Right now it sort of works. 现在,它可以工作了。 It copies the Label s and TextField s just fine, but it places them all into one column instead of copying the layout I already made. 它可以很好地复制LabelTextField ,但是将它们全部放在一栏中,而不是复制我已经做过的布局。 I figured it wouldn't work since none of the column/row index's were updated. 我认为,由于列/行索引均未更新,因此无法使用。 I don't understand why it sticks it all in one column though. 我不明白为什么将所有内容都放在一栏中。

If anyone could point me in the right direction to make this work that would be awesome. 如果有人可以指出正确的方向来完成这项工作,那将是非常棒的。

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

In the variation below, createGrid() returns a copy of your layout and createButton() returns a button that adds the copy to the enclosing grid , which is itself enclosed in a ScrollPane . 在下面的变型中, createGrid()返回布局和副本createButton()返回一个按钮,其将所述拷贝到封闭grid ,它本身包围在ScrollPane Click the Add Sample button to see the effect. 单击添加样本按钮以查看效果。 Note that because the labels and text fields are member variables, they will reference only the most recently created grid. 请注意,由于标签和文本字段是成员变量,因此它们将仅引用最近创建的网格。 You'll have to refactor them to meet your application's goals. 您必须对其进行重构才能实现应用程序的目标。

图片

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

You need to rethink your layout: Your createGrid() method creates the whole grid for you which is fine. 您需要重新考虑布局:您的createGrid()方法可以为您创建整个网格。 All you need to do is to add this grid to another container (like a VBox - I do not see any need to use another GridPane here). 所有你需要做的就是这个网添加到另一个容器(如VBox -我看不出有任何需要使用另一个GridPane这里)。 So, apply the following modifications: 因此,请进行以下修改:

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

In your start method, create the first grid and add it to the main layout which you also set as the Scene's top node: 在start方法中,创建第一个网格并将其添加到主布局中,该主布局也设置为Scene的顶部节点:

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

In your buttons action handler, you simply create another grid and add it to the main layout. 在按钮动作处理程序中,您只需创建另一个网格并将其添加到主布局即可。 Remove the actiontarget variable completely - you do not need to create another grid. 完全删除actiontarget变量-无需创建另一个网格。

Then, you need to add the button to your grid - the simplest way would be to pass the destination grid to the Button method as a parameter (this assumes that the button shall be available on each grid). 然后,您需要将按钮添加到网格中-最简单的方法是将目标网格作为参数传递给Button方法(假定按钮在每个网格上都可用)。 Also, the method should be renamed to something like createButton() . 同样,该方法应重命名为诸如createButton() The complete method now looks like this: 现在,完整的方法如下所示:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM