我需要一个空的tableview帮助。 当我将项目放在ObservableList中并使用此列表执行setItems时,tableview不会显示列表中的项目。
我已经包含了Minimal,Complete和Verifiable示例(我认为)。
主要课程。
public class GeneralController implements Initializable {
@FXML
private TableView<Subvencio> tabla;
@FXML
private TableColumn<Subvencio, Double> ctotal;
@FXML
private TableColumn<Subvencio, String> cesport;
ObservableList<Subvencio> subs = FXCollections.observableArrayList();
@Override
public void initialize(URL url, ResourceBundle rb) {
cesport.setCellValueFactory(new PropertyValueFactory<Subvencio, String>("Esport"));
ctotal.setCellValueFactory(new PropertyValueFactory<Subvencio, Double>("Total"));
tabla.setItems(subs);
}
//Mètode per a afegir una subvenció a la llista(Mitjansant un scene diferent i un showandWait).
@FXML
private void afegir(ActionEvent event) throws IOException {
//Carregem el controlador i inicialitzem la finestra a obrir.
FXMLLoader loader = new FXMLLoader(getClass().getResource("/model/Afegir.fxml"));
Parent root = loader.load();
Scene scene = new Scene(root);
Stage ventana2= new Stage();
ventana2.setMinHeight(380);
ventana2.getIcons().add(new Image("/estil/Boo.png"));
ventana2.setMinWidth(770);
ventana2.setTitle("Afegir dades");
ventana2.initModality(Modality.APPLICATION_MODAL);
ventana2.setScene(scene);
//Fem que espere fins a ser tancada i coloquem els elements a la taula.subs = new ObservableList<Subvencio>();
ventana2.showAndWait();
tabla.setItems(subs);
}
Afegir Class。
public class AfegirController implements Initializable {
@FXML
private TextField esport;
@FXML
private TextField equips;
@FXML
private TextField despeses;
@FXML
private TextField esportistes;
@FXML
private TextField puntuacio;
@FXML
private TextField socis;
@FXML
private CheckBox festes;
@FXML
private CheckBox disiplina;
@FXML
private CheckBox voluntari;
@FXML
private CheckBox instalacions;
@FXML
private Button bafegir;
Subvencio sub = new Subvencio();
//Metode per a afegir una subvencio a la llista de elements.
@FXML
private void afegir(ActionEvent event) {
//Comprobem si tots els textfielsd estan omplits, sino es així, mostrem un error.
if ((!equips.getText().isEmpty())
&& (equips.getText().trim().length()!=0)
&& (!despeses.getText().isEmpty())
&& (despeses.getText().trim().length()!=0)
&& (!esportistes.getText().isEmpty())
&& (esportistes.getText().trim().length()!=0)
&& (!puntuacio.getText().isEmpty())
&& (puntuacio.getText().trim().length()!=0)
&& (!socis.getText().isEmpty())
&& (socis.getText().trim().length()!=0)
&& (!esport.getText().isEmpty())
&& (esport.getText().trim().length()!=0))
{
//Passem els valors de el textfield als seus corresponents formats.
int aux1 = Integer.parseInt(equips.getText());
double aux2 = Double.parseDouble(despeses.getText());
int aux3 = Integer.parseInt(esportistes.getText());
int aux4 = Integer.parseInt(puntuacio.getText());
int aux5 = Integer.parseInt(socis.getText());
boolean aux6 = festes.isSelected();
boolean aux7 = disiplina.isSelected();
boolean aux8 = voluntari.isSelected();
boolean aux9 = instalacions.isSelected();
String aux10 = esport.getText();
//Carregem un controllardor per poder crear subvencions i la creeem. en cabar aques proces la finestra es tanca.
GeneralController aux = new GeneralController();
sub.setEsport(aux10);
sub.setEquips(aux1);
sub.setEsportistes(aux3);
sub.setFestes(aux6);
sub.setFormacio(aux7);
sub.setInstalacions(aux9);
sub.setPuntuacio(aux4);
sub.setSocis(aux5);
sub.setVoluntari(aux8);
sub.setdespeses(aux2);
aux.subs.add(sub);
Node minodo = (Node) event.getSource();
minodo.getScene().getWindow().hide();
}
else {
Alert alert = new Alert(Alert.AlertType.ERROR);
//Apliquem el css cridant al metode dialogpane
DialogPane dialogPane = alert.getDialogPane();
dialogPane.getStylesheets().add(getClass().getResource("/estil/flatterfx.css").toExternalForm());
dialogPane.getStyleClass().add("button");
Stage stage = (Stage) alert.getDialogPane().getScene().getWindow();
stage.getIcons().add(
new Image(this.getClass().getResource("/estil/Boo.png").toString()));
alert.setTitle("Error");
alert.setHeaderText("Error al afegir una subvenció.");
alert.setContentText("Deus emplenar tots els cuadres de text per poder afegir una subvenció.");
Optional<ButtonType> result = alert.showAndWait();
}
}
public void inicializaSubvencio (Subvencio aux){
sub = aux;
String aux1 = String.valueOf(aux.getEsport());
String aux2 = String.valueOf(aux.getEquips());
String aux3 = String.valueOf(aux.getDespeses());
String aux4 = String.valueOf(aux.getEsportistes());
String aux5 = String.valueOf(aux.getEsportistes());
String aux6 = String.valueOf(aux.getPuntuacio());
String aux7 = String.valueOf(aux.getSocis());
String aux8 = String.valueOf(aux.getTotal());
double total = aux.getTotal();
esport.setText(aux1);
equips.setText(aux2);
despeses.setText(aux3);
esportistes.setText(aux5);
puntuacio.setText(aux6);
socis.setText(aux7);
festes.setSelected(aux.getFestes());
disiplina.setSelected(aux.getFormacio());
voluntari.setSelected(aux.getVoluntari());
instalacions.setSelected(aux.getInstalacions());
}
}
和subvencio课。
public class Subvencio {
String esport;
int equips;
double despeses;
int esportistes;
int puntuacio;
int socis;
boolean festes;
boolean formacio;
boolean voluntari;
boolean instalacions;
double total;
//Mètodes generals de creacio d'una subvenció.
public Subvencio() {
this(null, 0, 0, 0, 0, 0, 0, false, false, false, false);
}
public Subvencio(String esport, double total, double despeses, int equips, int esportistes, int puntuacio,
int socis, boolean festes, boolean formacio,
boolean voluntari, boolean instalacions) {
this.esport = esport;
this.total = 0;
this.despeses = despeses;
this.equips = equips;
this.esportistes = esportistes;
this.puntuacio = puntuacio;
this.socis = socis;
this.festes = festes;
this.formacio = formacio;
this.instalacions = instalacions;
this.voluntari = voluntari;
}
//Mètodes getters i setters per poder treballar amb els valors que contè una subvenció.
public String getEsport() {
return esport;
}
public void setEsport(String esport) {
this.esport = esport;
}
}
编辑:@James_D:我使用你的一个控制器的实例,因为如果我不这样做,netbeans说我“非静态变量sub不能从静态上下文中引用”,我的大学教授说我这个rapair那个错误。我有一个其他的例子形成一个PC商店,我使用此修复程序,这个错误没有出现在示例中,但在这个应用程序中它出现。
这个应用程序的想法是这样的: 当按下一个按钮和文本字段填满程序关闭那个窗口并在第二个窗口的tableview中放置一个subvencio。我的问题是,当我这样做时,tableview不会在tableview上显示任何项目。
在我的应用中添加了一个超级链接,用于检查所有代码并测试错误。 Subvencio App
我添加了一个链接,因为我不知道在我的最小代码中是否可以测试错误。 要重现错误,您可以打开app push afegir按钮并填充textfields.A之后,再次推送afegir。 谢谢你的帮助。
答案 0 :(得分:1)
要解决此问题,您可以执行以下操作: 在Main类中,在打开2窗口时加载正确的控制器:
private void afegir(ActionEvent event) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/model/Afegir.fxml"));
Parent root = loader.load();
//load the correct controller
AfegirController controller = loader.getController();
Scene scene = new Scene(root);
Stage ventana2= new Stage();
ventana2.setMinHeight(380);
ventana2.getIcons().add(new Image("/estil/Boo.png"));
ventana2.setMinWidth(770);
ventana2.setTitle("Afegir dades");
ventana2.initModality(Modality.APPLICATION_MODAL);
ventana2.setScene(scene);
taula.subs = new ObservableList<Subvencio>();
ventana2.showAndWait();
//Add the sub to Observable list here and add the observableList to tableview.
subs.add(controller.getSub());
tabla.setItems(subs);
}
接下来在Afegir课堂上这样做:
public Subvencio getSub() {
return sub;
}
这是一个公共方法来访问我喜欢添加到列表中的子。 最后在afegir Class
中删除这一行GeneralController aux = new GeneralController();
aux.subs.add(sub);
我这样做,我的tableview正确显示了这些项目。 谢谢你的帮助。