Java 如何在程序中动态添加文本字段?
在FXML中,我有根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
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中遇到异常。