Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在程序中动态添加文本字段?_Java_Javafx - Fatal编程技术网

Java 如何在程序中动态添加文本字段?

Java 如何在程序中动态添加文本字段?,java,javafx,Java,Javafx,在FXML中,我有根BorderPane,在它的中心是另一个BorderPane,在第二个BorderPane的中心是GridPane。我想根据数组的大小添加TextFields。我不知道如何访问网格窗格。在FXML中我设置了fx:id,但在我的控制器中它不可见。(@FXML GridPane nameInFxml) 我想使用fx:id=“details”访问该网格窗格 控制器: public class RepairsController { @FXML TextField

在FXML中,我有根
BorderPane
,在它的中心是另一个
BorderPane
,在第二个
BorderPane
的中心是GridPane。我想根据数组的大小添加
TextField
s。我不知道如何访问网格窗格。在FXML中我设置了fx:id,但在我的控制器中它不可见。(
@FXML GridPane nameInFxml


我想使用fx:id=“details”访问该网格窗格

控制器:

public class RepairsController {
    @FXML
    TextField mechanikTextField;
    @FXML
    TextField dataTextField;
    @FXML
    TextField nrRejTextField;
    @FXML
    Button nowyButton;
    @FXML
    Button usunButton;
    @FXML
    Button zapiszButton;
    @FXML
    TextField searchTextField;
    @FXML
    TableView<Repair> repairsTable;
    @FXML
    GridPane details;





    private ObservableList<Repair> repairs;
    private Car car;

    public RepairsController() {

    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public void initialize(){

        repairs = DataSource.getInstance().queryAllRepairs(car.getNrRej());

        filter(repairs);
        onChangeListener();
        repairsTable.getSelectionModel().selectFirst();

        nowyButtonPressed();
        usunButtonPressed();


    }

    @FXML
    public void filter(ObservableList<Repair> list) {

        FilteredList<Repair> filteredData = new FilteredList<>(list, p -> true);

        searchTextField.textProperty().addListener((observable, oldValue, newValue) -> {

            filteredData.setPredicate(repair-> {
                if (newValue == null || newValue.isEmpty()) {
                    return true;
                }
                String loweCaseFilter = newValue.toLowerCase();
                if (repair.getData().toLowerCase().contains(loweCaseFilter)) {
                    return true;
                }

                if((repair.getMechanik().toLowerCase().contains(loweCaseFilter))){
                    return true;
                }

                return false;

            });

        });
        SortedList<Repair> sortedData = new SortedList<>(filteredData);
        sortedData.comparatorProperty().bind(repairsTable.comparatorProperty());
        repairsTable.setItems(sortedData);

    }

    private void onChangeListener(){
        repairsTable.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Repair>() {
            @Override
            public void changed(ObservableValue<? extends Repair> observableValue, Repair repair, Repair t1) {
                if(t1 != null) {
                    mechanikTextField.setText(repairsTable.getSelectionModel().getSelectedItem().getMechanik());
                    dataTextField.setText(repairsTable.getSelectionModel().getSelectedItem().getData());
                }



                TextField[] coTextField = new TextField[30];
                if(repairsTable.getSelectionModel().getSelectedItem().getRepairDetailsList() !=null) {

                    for (int i = 0; i < repairsTable.getSelectionModel().getSelectedItem().getRepairDetailsList().size(); i++) {
//at this point I get the exception
                       details.add(coTextField[i], 2, 2);

                    }
                }
            }
        });
    }

    public void nowyButtonPressed(){
        nowyButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                Repair repair = new Repair();
                repairs.add(repair);
            }
        });
    }

    public void usunButtonPressed(){
        usunButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                repairs.remove(repairsTable.getSelectionModel().getSelectedItem());
            }
        });
    }




}
公共类修复控制器{
@FXML
TextField mechanikTextField;
@FXML
文本字段数据文本字段;
@FXML
TextField nrRejTextField;
@FXML
按钮现在按钮;
@FXML
按钮usunButton;
@FXML
按钮zapiszButton;
@FXML
TextField搜索TextField;
@FXML
表视图稳定;
@FXML
网格窗格详细信息;
私人维修;
私家车;
公共维修控制器(){
}
公共汽车{
返回车;
}
公共车辆{
这辆车;
}
公共无效初始化(){
repairs=DataSource.getInstance().queryalrepairs(car.getNrRej());
过滤器(修理);
onChangeListener();
repairsTable.getSelectionModel().selectFirst();
现在按下按钮();
usunButtonPressed();
}
@FXML
公共无效过滤器(可观察列表){
FilteredList filteredData=新的FilteredList(列表,p->true);
searchTextField.textProperty().addListener((可观察、旧值、新值)->{
filteredData.setPredicate(修复->{
if(newValue==null | | newValue.isEmpty()){
返回true;
}
字符串LowerCaseFilter=newValue.toLowerCase();
if(repair.getData().toLowerCase().contains(LowerCaseFilter)){
返回true;
}
if((repair.getMechanik().toLowerCase().contains(LowerCaseFilter))){
返回true;
}
返回false;
});
});
SortedList sortedData=新的SortedList(filteredData);
sortedData.comparatorProperty().bind(repairsTable.comparatorProperty());
repairsTable.setItems(分类数据);
}
私有void onChangeListener(){
repairsTable.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
@凌驾

public void已更改(observeValue您收到一个指向此行的空指针do

TextField[] coTextField = new TextField[30];
此数组中没有文本字段已初始化。您刚刚创建了一个大小为30的空数组,可以容纳文本字段

如果您将此代码放在该行之后(
TextField[]coTextField=newtextfield[30];
),我假设您的NPE将消失

for (int i = 0; i < coTextField.length; i++) 
    coTextField[i] = new TextField();
for(int i=0;i
此代码将为数组中的每个索引创建一个新的文本字段


如果您对本文中的任何内容有任何其他问题,请告诉我,您将收到一个指向此行的空指针

TextField[] coTextField = new TextField[30];
此数组中没有文本字段已初始化。您刚刚创建了一个大小为30的空数组,可以容纳文本字段

如果您将此代码放在该行之后(
TextField[]coTextField=newtextfield[30];
),我假设您的NPE将消失

for (int i = 0; i < coTextField.length; i++) 
    coTextField[i] = new TextField();
for(int i=0;i
此代码将为数组中的每个索引创建一个新的文本字段


如果您对本文中的任何内容有任何其他问题,请告诉我。

我不认为它正在加载,我认为它正在访问,这就是问题所在@MattI已将fx:id属性与字段名匹配,但我无法访问该GridPane。在我的控制器中,GridPane是灰色的,而它应该是紫色的,因为它与FXML匹配。@MattI comment在我将字段名从detailsGridPane更改为details之前,我已经解决了这个问题。所以更新后的字段GridPane详细信息也不起作用。我在线程“JavaFX应用程序线程”中遇到异常java.lang.NullPointerException。我不认为它正在加载,我认为它正在访问,这是问题所在@MattI已将fx:id属性与字段名匹配,但我无法访问该GridPane。在我的控制器中,GridPane是灰色的,而它应该是紫色的,因为它与FXML匹配。@MattI在我将字段名从d更改为d之前对此进行了注释etailsGridPane到details。所以更新的归档网格窗格details也不起作用。我在线程“JavaFX应用程序线程”java.lang.NullPointerException中遇到异常。