我大多只是这样做,试图加快一些繁琐的办公任务。
到目前为止,我已创建了GridPane
我想要的内容,我想复制该设置并将其直接复制到现有GridPane
下面。
现在它有点工作。它复制Label
和TextField
就好了,但它将它们全部放在一列而不是复制我已经制作的布局。我认为它不会起作用,因为没有列/行索引被更新。我不明白为什么它会把它全部放在一个专栏中。
如果有人能指出我正确的方向让这项工作变得非常棒。
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");
// }
});
}
}
答案 0 :(得分:1)
在下面的变体中,createGrid()
会返回您的布局副本,createButton()
会返回一个按钮,将副本添加到封闭的grid
中,该ScrollPane
本身包含在{{1}中}}。单击添加样本按钮以查看效果。请注意,因为标签和文本字段是成员变量,所以它们仅引用最近创建的网格。您必须重构它们才能满足您的应用目标。
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);
}
});
}