2017-10-24 2 views
0

Ich habe ein Problem mit Tableview in JavaFX.JavaFX tableview, meine Liste wird gelöscht, wenn ich ein neues Objekt hinzufüge

Immer, wenn ich eine neue Zeile in meinem Tableview hinzufüge, wird meine Liste gelöscht.

Ich mache eine Liste mit 4 Objekten darin vor Wenn ich meine Schaltfläche verwende, um eine Zeile hinzuzufügen, wird die Zeile hinzugefügt.

Die Sache ist, wenn die Zeile hinzugefügt wird. Wenn ich Text in einer meiner Zellen hatte, ist alles gelöscht.

Hier ist mein Hauptprogramm:

package application; 

import vue.*; 
import domaine.Reponse; 
import javafx.application.Application; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TableView; 
import javafx.stage.Stage; 


public class Mainfx extends Application { 
public static final String nomApplication = "QCM-Builder"; 
private TableViewReponse tableauReponse; 
private Button addButton; 

public static void main(String[] args) { 
    launch(args); 
} 

public void start(Stage stage){ 
    Scene scene = new Scene(new Group()); 
    stage.setTitle("Table View Sample"); 
     stage.setWidth(300); 
     stage.setHeight(500); 
    tableauReponse = new TableViewReponse(); 

    tableauReponse.setTranslateX(130); 
    tableauReponse.setTranslateY(300); 
    tableauReponse.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 
    tableauReponse.setPrefHeight(150); 

    addButton = new Button("Add"); 
    addButton.setTranslateX(400); 
    addButton.setTranslateY(400); 
    ((Group) scene.getRoot()).getChildren().addAll(addButton); 
    addButton.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent e) { 
      ObservableList<Reponse> list = tableauReponse.getItems(); 
      list.add(new Reponse("",false)); 
      tableauReponse.setItems(list); 
      } 
    }); 

    ((Group) scene.getRoot()).getChildren().addAll(tableauReponse); 
    stage.setScene(scene); 
    stage.show(); 

} 
} 

Und hier ist meine benutzerdefinierte Tableview

package vue; 

import java.io.IOException; 
import java.sql.SQLException; 
import domaine.Reponse; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.control.TableCell; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableColumn.CellDataFeatures; 
import javafx.scene.control.TableColumn.CellEditEvent; 
import javafx.scene.control.TablePosition; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.CheckBoxTableCell; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.control.cell.TextFieldTableCell; 
import javafx.scene.layout.StackPane; 
import javafx.util.Callback; 

public class TableViewReponse extends TableView<Reponse> { 

private TableColumn<Reponse, String> reponseCol; 
private TableColumn<Reponse, Boolean> singleCol; 
private final ObservableList<Reponse> list = 
     FXCollections.observableArrayList(
     new Reponse("",false), 
     new Reponse("",false), 
     new Reponse("",false), 
     new Reponse("",false) 
     ); 

public TableViewReponse() { 
    super(); 

    this.setEditable(true); 
    reponseCol = new TableColumn<Reponse, String>("Réponse"); 

    singleCol = new TableColumn<Reponse, Boolean>("Correcte ?"); 

    // ==== FULL NAME (TEXT FIELD) === 

    reponseCol.setCellValueFactory(new PropertyValueFactory<Reponse, String>("reponse")); 

    reponseCol.setCellFactory(TextFieldTableCell.<Reponse>forTableColumn()); 

    reponseCol.setMinWidth(200); 

    // On Cell edit commit (for FullName column) 
    reponseCol.setOnEditCommit((CellEditEvent<Reponse, String> event) -> { 
     TablePosition<Reponse, String> pos = event.getTablePosition(); 

     int row = pos.getRow(); 
     Reponse reponse = event.getTableView().getItems().get(row); 

     reponse.setLibelle(event.getNewValue()); 

     try { 
      System.out.println("Bisous "+ reponse.toStringAMC()); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    }); 

    // ==== SINGLE? (CHECK BOX) === 
    singleCol.setCellValueFactory(new Callback<CellDataFeatures<Reponse, Boolean>, ObservableValue<Boolean>>() { 

     @Override 
     public ObservableValue<Boolean> call(CellDataFeatures<Reponse, Boolean> param) { 
      Reponse reponse = param.getValue(); 

      SimpleBooleanProperty booleanProp = new SimpleBooleanProperty(reponse.estJuste()); 

      // Note: singleCol.setOnEditCommit(): Not work for 
      // CheckBoxTableCell. 

      // When "Single?" column change. 
      booleanProp.addListener(new ChangeListener<Boolean>() { 

       @Override 
       public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, 
         Boolean newValue) { 
        reponse.setJuste(newValue); 
       } 
      }); 
      return booleanProp; 
     } 
    }); 

    singleCol.setCellFactory(new Callback<TableColumn<Reponse, Boolean>, TableCell<Reponse, Boolean>>() { 
     @Override 
     public TableCell<Reponse, Boolean> call(TableColumn<Reponse, Boolean> p) { 
      CheckBoxTableCell<Reponse, Boolean> cell = new CheckBoxTableCell<Reponse, Boolean>(); 
      cell.setAlignment(Pos.CENTER); 
      //cell.commitEdit(true); 
      return cell; 
     } 
    }); 

    this.setItems(list); 
    this.getColumns().addAll(reponseCol, singleCol); 

    StackPane root = new StackPane(); 
    root.setPadding(new Insets(5)); 
} 


public void ajouterReponse() { 
    ObservableList<Reponse> list = this.getItems(); 
    list.add(new Reponse("", false)); 
    this.setItems(list); 
} 

public String getColReponse(int i) { 
    return reponseCol.getTableView().getItems().get(i).getLibelle(); 
} 

public void viderColReponse(int i) { 
    reponseCol.getTableView().getItems().get(i).setLibelle(null); 
} 

public Boolean getColSingle(int i) { 
    return this.singleCol.getCellData(i); 
} 
} 

Irgendwelche Ideen warum? Dank durch Voraus

Antwort

0

Wie Sie nicht zeigen Ihre Reponse Klasse i nur annehmen kann, aber ich denke, das Problem der Nichtübereinstimmung Ursache kommen kann durch

reponseCol.setCellValueFactory(new PropertyValueFactory<Reponse, String>("reponse")); 

und die Tatsache, Sie tun:

reponseCol.setOnEditCommit((CellEditEvent<Reponse, String> event) -> { 
    //Some code 
    reponse.setLibelle(event.getNewValue()); 
    //the rest 
}); 

Angenommen, Sie verwenden das gängige Benennungssystem für Setter/Getter Ihre Reponse Klasse sollte ein libelle Feld haben, das Sie beim Commit der Zelle aktualisieren.

Auf der anderen Seite sagen Sie der Spalte, um den Wert zu suchen, der in einer Eigenschaft mit dem Namen reponse angezeigt wird (vielleicht ein anderes Feld Ihrer Klasse?).

Sie aktualisieren einen anderen Wert als den, den Sie bei der automatischen Aktualisierung anzeigen möchten. Daher ist die Spalte klar, wenn Sie eine neue hinzufügen.

es zu beheben Sie entweder tun können:

reponseCol.setCellValueFactory(new PropertyValueFactory<Reponse, String>("libelle")); 

die libelle anzuzeigen oder das reponse Feld zu aktualisieren, anstatt auf begehen.

+0

Das war's! Es funktioniert jetzt. Merci Baptiste! – Dada

Verwandte Themen