JavaFX tableview 显示不正确
JavaFX tableview not displaying properly
我有一个 JavaFX 应用程序,它的场景有两个表视图,第一个可以正常工作,第二个不能。
第二个表格视图只显示它应该显示的 5 列中的 2 列的内容,而第二列的内容实际上应该在最后一列。我以前使用过 javaFX 几次,这是我第一次看到这样的东西,我修改了我的代码 2 或 3 次以寻找可能错误或拼写错误的东西,但我一直无法找到它。
这是表格视图显示的内容。
这是它包含的对象 class 的代码。
public class Producte {
private int codi;
private String nom;
private String descripcio;
private float preu;
private int codiFabricant;
public Producte(String nom, String descripcio, float preu,
int codiFabricant) {
this.nom = nom;
this.descripcio = descripcio;
this.preu = preu;
this.codiFabricant = codiFabricant;
}
public Producte(int codi, String nom, String descripcio, float preu,
int codiFabricant) {
this.codi = codi;
this.nom = nom;
this.descripcio = descripcio;
this.preu = preu;
this.codiFabricant = codiFabricant;
}
public int getCodi() {
return codi;
}
public void setCodi(int codi) {
this.codi = codi;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getDescripcio() {
return descripcio;
}
public void setDescripcio(String descripcio) {
this.descripcio = descripcio;
}
public float getPreu() {
return preu;
}
public void setPreu(float preu) {
this.preu = preu;
}
public int getCodiFabricant() {
return codiFabricant;
}
public void setCodiFabricant(int codiFabricant) {
this.codiFabricant = codiFabricant;
}
@Override
public String toString() {
return "Producte [codi=" + codi + ", nom=" + nom + ", descripcio="
+ descripcio + ", preu=" + preu + ", codiFabricant="
+ codiFabricant + "]";
}
}
这是加载场景的方法中的代码。
第一个表视图是 dirTable,第二个表视图(不能正常工作的是 prodTable)。在此先感谢您的帮助:/
static Scene directorScene() {
GridPane gridPane = new GridPane();
gridPane.setAlignment(Pos.CENTER);
gridPane.setVgap(25);
gridPane.setHgap(25);
director = DirectorFunctions.director;
final ObservableList<Director> dirList = FXCollections.observableArrayList();
dirList.add(director);
TableView<Director> dirTable = new TableView<>();
dirTable.setItems(dirList);
TableColumn<Director, String> fabCol = new TableColumn<>("Fabricant");
TableColumn<Director, String> dniCol = new TableColumn<>("DNI");
TableColumn<Director, String> nomCol = new TableColumn<>("Nom");
TableColumn<Director, String> mailCol = new TableColumn<>("Mail");
TableColumn<Director, String> passCol = new TableColumn<>("Pass");
fabCol.setCellValueFactory(new PropertyValueFactory<Director,String>("Nom"));
dniCol.setCellValueFactory(new PropertyValueFactory<Director,String>("DniDirector"));
nomCol.setCellValueFactory(new PropertyValueFactory<Director,String>("NomDirector"));
mailCol.setCellValueFactory(new PropertyValueFactory<Director,String>("MailDirector"));
passCol.setCellValueFactory(new PropertyValueFactory<Director,String>("PasswordDirector"));
dirTable.getColumns().setAll(fabCol, dniCol, nomCol, mailCol, passCol);
dirTable.setMinWidth(450);
dirTable.setMaxHeight(52);
dirTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
gridPane.add(dirTable, 0, 0);
Button modificarDirector = new Button("Modificar");
modificarDirector.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
gridPane.add(modificarDirector, 1, 0);
final ObservableList<Producte> prodList = FXCollections.observableArrayList();
for (Producte p:DirectorFunctions.productes.values()) {
prodList.add(p);
}
TableView<Producte> prodTable = new TableView<>();
prodTable.setItems(prodList);
TableColumn<Producte, String> codiPCol = new TableColumn<>("Codi");
TableColumn<Producte, String> nomPCol = new TableColumn<>("Nom");
TableColumn<Producte, String> descPCol = new TableColumn<>("Descripció");
TableColumn<Producte, String> preuPCol = new TableColumn<>("Preu");
TableColumn<Producte, String> fabPCol = new TableColumn<>("Fabricant");
codiPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Codi"));
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Nom"));
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Descripcio"));
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Preu"));
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("CodiFabricant"));
prodTable.getColumns().setAll(codiPCol, nomPCol, descPCol, preuPCol, fabPCol);
prodTable.setMinWidth(450);
prodTable.setMaxHeight(200);
prodTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
gridPane.add(prodTable, 0, 1);
Button nouButton = new Button("Nou");
nouButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
nouButton.setMinWidth(75);
Button modButton = new Button("Modificar");
modButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
modButton.setMinWidth(75);
Button delButton = new Button("Borrar");
delButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
delButton.setMinWidth(75);
Button backButton = new Button("Tornar");
backButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
backButton.setMinWidth(75);
gridPane.add(backButton, 1, 2);
VBox vbox = new VBox(25);
vbox.getChildren().addAll(nouButton, modButton, delButton);
gridPane.add(vbox, 1, 1);
Scene scene = new Scene(gridPane, 640, 480, Color.web("eee"));
return scene;
}
这就是导演class谁也想看
public class Director {
private int codi;
private String nom;
private String dniDirector;
private String nomDirector;
private String mailDirector;
private String passwordDirector;
public Director(int codi, String nom, String dniDirector,
String nomDirector, String mailDirector, String passwordDirector) {
this.codi = codi;
this.nom = nom;
this.dniDirector = dniDirector;
this.nomDirector = nomDirector;
this.mailDirector = mailDirector;
this.passwordDirector = passwordDirector;
}
public int getCodi() {
return codi;
}
public void setCodi(int codi) {
this.codi = codi;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getDniDirector() {
return dniDirector;
}
public void setDniDirector(String dniDirector) {
this.dniDirector = dniDirector;
}
public String getNomDirector() {
return nomDirector;
}
public void setNomDirector(String nomDirector) {
this.nomDirector = nomDirector;
}
public String getMailDirector() {
return mailDirector;
}
public void setMailDirector(String mailDirector) {
this.mailDirector = mailDirector;
}
public String getPasswordDirector() {
return passwordDirector;
}
public void setPasswordDirector(String passwordDirector) {
this.passwordDirector = passwordDirector;
}
@Override
public String toString() {
return "Fabricant [codi=" + codi + ", nom=" + nom + ", dniDirector="
+ dniDirector + ", nomDirector=" + nomDirector
+ ", mailDirector=" + mailDirector + ", passwordDirector="
+ passwordDirector + "]";
}
}
我建议您对所有模型使用 JavaFX 属性。您可以在 here.
中找到示例
PropertyValueFactory<S,T>
在 S
中查找类型为 T
的 属性,其名称与您在构造函数中输入的名称相同。
例如,在模型 class Product
中有一个字符串 属性 字段 name
,
new PropertyValueFactory<Product, String>("name")
将寻找:
nameProperty()
如果没有找到,它会进一步寻找getName()
并用ReadOnlyObjectWrapper
包裹起来再返回。
来自文档,
If no method matching this pattern exists, there is fall-through
support for attempting to call get() or is() (that
is, getFirstName() or isFirstName() in the example above). If a method
matching this pattern exists, the value returned from this method is
wrapped in a ReadOnlyObjectWrapper and returned to the TableCell
你的例子中的问题是你的 table 列有一个 cellValueFactory 说,
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Preu"));
但是您的 getter 方法返回的是 float
而不是 String
public float getPreu() {
return preu;
}
我已经发现了问题,我使用复制+粘贴来复制代码行,但我忘记更改 table 列的名称。我是个白痴-__-.
抱歉浪费你们的时间...
顺便问一下,有没有一种方法可以关闭 thread/question 而无需询问模组之类的东西?
我有一个 JavaFX 应用程序,它的场景有两个表视图,第一个可以正常工作,第二个不能。
第二个表格视图只显示它应该显示的 5 列中的 2 列的内容,而第二列的内容实际上应该在最后一列。我以前使用过 javaFX 几次,这是我第一次看到这样的东西,我修改了我的代码 2 或 3 次以寻找可能错误或拼写错误的东西,但我一直无法找到它。
这是表格视图显示的内容。
这是它包含的对象 class 的代码。
public class Producte {
private int codi;
private String nom;
private String descripcio;
private float preu;
private int codiFabricant;
public Producte(String nom, String descripcio, float preu,
int codiFabricant) {
this.nom = nom;
this.descripcio = descripcio;
this.preu = preu;
this.codiFabricant = codiFabricant;
}
public Producte(int codi, String nom, String descripcio, float preu,
int codiFabricant) {
this.codi = codi;
this.nom = nom;
this.descripcio = descripcio;
this.preu = preu;
this.codiFabricant = codiFabricant;
}
public int getCodi() {
return codi;
}
public void setCodi(int codi) {
this.codi = codi;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getDescripcio() {
return descripcio;
}
public void setDescripcio(String descripcio) {
this.descripcio = descripcio;
}
public float getPreu() {
return preu;
}
public void setPreu(float preu) {
this.preu = preu;
}
public int getCodiFabricant() {
return codiFabricant;
}
public void setCodiFabricant(int codiFabricant) {
this.codiFabricant = codiFabricant;
}
@Override
public String toString() {
return "Producte [codi=" + codi + ", nom=" + nom + ", descripcio="
+ descripcio + ", preu=" + preu + ", codiFabricant="
+ codiFabricant + "]";
}
}
这是加载场景的方法中的代码。 第一个表视图是 dirTable,第二个表视图(不能正常工作的是 prodTable)。在此先感谢您的帮助:/
static Scene directorScene() {
GridPane gridPane = new GridPane();
gridPane.setAlignment(Pos.CENTER);
gridPane.setVgap(25);
gridPane.setHgap(25);
director = DirectorFunctions.director;
final ObservableList<Director> dirList = FXCollections.observableArrayList();
dirList.add(director);
TableView<Director> dirTable = new TableView<>();
dirTable.setItems(dirList);
TableColumn<Director, String> fabCol = new TableColumn<>("Fabricant");
TableColumn<Director, String> dniCol = new TableColumn<>("DNI");
TableColumn<Director, String> nomCol = new TableColumn<>("Nom");
TableColumn<Director, String> mailCol = new TableColumn<>("Mail");
TableColumn<Director, String> passCol = new TableColumn<>("Pass");
fabCol.setCellValueFactory(new PropertyValueFactory<Director,String>("Nom"));
dniCol.setCellValueFactory(new PropertyValueFactory<Director,String>("DniDirector"));
nomCol.setCellValueFactory(new PropertyValueFactory<Director,String>("NomDirector"));
mailCol.setCellValueFactory(new PropertyValueFactory<Director,String>("MailDirector"));
passCol.setCellValueFactory(new PropertyValueFactory<Director,String>("PasswordDirector"));
dirTable.getColumns().setAll(fabCol, dniCol, nomCol, mailCol, passCol);
dirTable.setMinWidth(450);
dirTable.setMaxHeight(52);
dirTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
gridPane.add(dirTable, 0, 0);
Button modificarDirector = new Button("Modificar");
modificarDirector.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
gridPane.add(modificarDirector, 1, 0);
final ObservableList<Producte> prodList = FXCollections.observableArrayList();
for (Producte p:DirectorFunctions.productes.values()) {
prodList.add(p);
}
TableView<Producte> prodTable = new TableView<>();
prodTable.setItems(prodList);
TableColumn<Producte, String> codiPCol = new TableColumn<>("Codi");
TableColumn<Producte, String> nomPCol = new TableColumn<>("Nom");
TableColumn<Producte, String> descPCol = new TableColumn<>("Descripció");
TableColumn<Producte, String> preuPCol = new TableColumn<>("Preu");
TableColumn<Producte, String> fabPCol = new TableColumn<>("Fabricant");
codiPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Codi"));
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Nom"));
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Descripcio"));
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Preu"));
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("CodiFabricant"));
prodTable.getColumns().setAll(codiPCol, nomPCol, descPCol, preuPCol, fabPCol);
prodTable.setMinWidth(450);
prodTable.setMaxHeight(200);
prodTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
gridPane.add(prodTable, 0, 1);
Button nouButton = new Button("Nou");
nouButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
nouButton.setMinWidth(75);
Button modButton = new Button("Modificar");
modButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
modButton.setMinWidth(75);
Button delButton = new Button("Borrar");
delButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
delButton.setMinWidth(75);
Button backButton = new Button("Tornar");
backButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// TODO Auto-generated method stub
}
});
backButton.setMinWidth(75);
gridPane.add(backButton, 1, 2);
VBox vbox = new VBox(25);
vbox.getChildren().addAll(nouButton, modButton, delButton);
gridPane.add(vbox, 1, 1);
Scene scene = new Scene(gridPane, 640, 480, Color.web("eee"));
return scene;
}
这就是导演class谁也想看
public class Director {
private int codi;
private String nom;
private String dniDirector;
private String nomDirector;
private String mailDirector;
private String passwordDirector;
public Director(int codi, String nom, String dniDirector,
String nomDirector, String mailDirector, String passwordDirector) {
this.codi = codi;
this.nom = nom;
this.dniDirector = dniDirector;
this.nomDirector = nomDirector;
this.mailDirector = mailDirector;
this.passwordDirector = passwordDirector;
}
public int getCodi() {
return codi;
}
public void setCodi(int codi) {
this.codi = codi;
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getDniDirector() {
return dniDirector;
}
public void setDniDirector(String dniDirector) {
this.dniDirector = dniDirector;
}
public String getNomDirector() {
return nomDirector;
}
public void setNomDirector(String nomDirector) {
this.nomDirector = nomDirector;
}
public String getMailDirector() {
return mailDirector;
}
public void setMailDirector(String mailDirector) {
this.mailDirector = mailDirector;
}
public String getPasswordDirector() {
return passwordDirector;
}
public void setPasswordDirector(String passwordDirector) {
this.passwordDirector = passwordDirector;
}
@Override
public String toString() {
return "Fabricant [codi=" + codi + ", nom=" + nom + ", dniDirector="
+ dniDirector + ", nomDirector=" + nomDirector
+ ", mailDirector=" + mailDirector + ", passwordDirector="
+ passwordDirector + "]";
}
}
我建议您对所有模型使用 JavaFX 属性。您可以在 here.
中找到示例PropertyValueFactory<S,T>
在 S
中查找类型为 T
的 属性,其名称与您在构造函数中输入的名称相同。
例如,在模型 class Product
中有一个字符串 属性 字段 name
,
new PropertyValueFactory<Product, String>("name")
将寻找:
nameProperty()
如果没有找到,它会进一步寻找getName()
并用ReadOnlyObjectWrapper
包裹起来再返回。
来自文档,
If no method matching this pattern exists, there is fall-through support for attempting to call get() or is() (that is, getFirstName() or isFirstName() in the example above). If a method matching this pattern exists, the value returned from this method is wrapped in a ReadOnlyObjectWrapper and returned to the TableCell
你的例子中的问题是你的 table 列有一个 cellValueFactory 说,
nomPCol.setCellValueFactory(new PropertyValueFactory<Producte, String>("Preu"));
但是您的 getter 方法返回的是 float
而不是 String
public float getPreu() {
return preu;
}
我已经发现了问题,我使用复制+粘贴来复制代码行,但我忘记更改 table 列的名称。我是个白痴-__-.
抱歉浪费你们的时间...
顺便问一下,有没有一种方法可以关闭 thread/question 而无需询问模组之类的东西?