web-dev-qa-db-fra.com

Eléments d'actualisation JavaView TableView

J'ai ce problème commun, comme il semble être. Ma vue de table ne rafraîchira pas mes éléments après leur réinitialisation. J'ai vérifié les données et c'est la nouvelle. 

J'ai essayé plusieurs solutions à partir d'Internet mais pas de succès.  

Impossible de réinitialiser toutes les colonnes car il en ajoute un vide (vous ne savez pas pourquoi) et le redimensionnement se casse.

Ma table n'est pas éditable . Les nouvelles données sont modifiées.

Les données sont actualisées si I change l'ordre des articles et que les lignes changent (: |).

Je suis juste laissé sans idées.

Pour le moment, le code de rafraîchissement est assez simple.

ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);

Encore une fois, les nouvelles données sont correctes. Lorsque je fais une sélection dans la table, il retourne le nouvel élément correct.

54
user1236048

J'ai eu un problème similaire avec rafraîchissant. Ma solution a été de limiter les opérations sur la ObservableList à celles qui fonctionnent correctement avec bind().

Supposons que ObservableList obsList soit la liste sous-jacente pour le TableView.

Alors
obsList.clear() (hérité de Java.util.List<>) sera pas mis à jour la TableView correctement mais.

Appelant également setItem(obsList) a fait ne fonctionne pas pour déclencher un rafraîchissement ... mais ...

obsList.removeAll(obsList) (écrasé par ObservableList) fonctionne bien car il déclenche correctement le changeEvent.

Remplir une liste avec un contenu complètement nouveau fonctionne alors comme suit:

  • obsList.removeAll(obsList);
  • obsList.add(...); //e.g. in a loop...

ou

  • obsList.removeAll(obsList);
  • FXCollections.copy(obsList, someSourceList)

Cordialement Ingo

38
Ingo

Solution de contournement:

 tableView.getColumns().get(0).setVisible(false);
 tableView.getColumns().get(0).setVisible(true);
59
Daniel De León

Depuis JavaFX 8u60, vous pouvez utiliser (en supposant que tableView est une instance de TableView class):

tableView.refresh();

De la documentation:

Appeler refresh () oblige le contrôle TableView à recréer et repeupler les cellules nécessaires pour peupler les limites visuelles du fichier contrôle. En d'autres termes, cela force le TableView à mettre à jour ce qu'il montre à l'utilisateur. Ceci est utile dans les cas où le sous-jacent la source de données a changé d'une manière qui n'est pas observée par TableView lui-même.

37
Elltz

METTRE À JOUR:
Enfin, l'actualisation des vues de table est résolue dans JavaFX 8u60, disponible pour un accès anticipé.


À propos de l'actualisation, voir Mise à jour des lignes dans Tableview .
Et à propos de la colonne vide, voir JavaFx 2 crée TableView avec une seule colonne . Fondamentalement, il ne s’agit pas d’une colonne, c’est-à-dire que vous ne pouvez pas sélectionner l’élément en cliquant sur les éléments de cette colonne vide. C'est juste une zone vide stylée comme une rangée.


UPDATE: Si vous mettez à jour le tableView via reseller_table.setItems(data), vous n'avez pas besoin d'utiliser SimpleStringProperty. Il serait utile que vous mettiez à jour une seule ligne/élément. Voici un exemple complet d'actualisation de l'actualisation des données de la table: 

import Java.util.ArrayList;
import Java.util.List;
import javafx.application.Application;
import javafx.collections.FXCollections;
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.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Dddeb extends Application {

    public static class Product {
        private String name;
        private String code;

        public Product(String name, String code) {
            this.name = name;
            this.code = code;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    private TableView<Product> productTable = new TableView<Product>();

    @Override
    public void start(Stage stage) {

        Button refreshBtn = new Button("Refresh table");
        refreshBtn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent arg0) {
                // You can get the new data from DB
                List<Product> newProducts = new ArrayList<Product>();
                newProducts.add(new Product("new product A", "1201"));
                newProducts.add(new Product("new product B", "1202"));
                newProducts.add(new Product("new product C", "1203"));
                newProducts.add(new Product("new product D", "1244"));

                productTable.getItems().clear();
                productTable.getItems().addAll(newProducts);
                //productTable.setItems(FXCollections.observableArrayList(newProducts));
            }
        });

        TableColumn nameCol = new TableColumn("Name");
        nameCol.setMinWidth(100);
        nameCol.setCellValueFactory(new PropertyValueFactory<Product, String>("name"));

        TableColumn codeCol = new TableColumn("Code");
        codeCol.setCellValueFactory(new PropertyValueFactory<Product, String>("code"));

        productTable.getColumns().addAll(nameCol, codeCol);
        productTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        // You can get the data from DB
        List<Product> products = new ArrayList<Product>();
        products.add(new Product("product A", "0001"));
        products.add(new Product("product B", "0002"));
        products.add(new Product("product C", "0003"));

        //productTable.getItems().addAll(products);
        productTable.setItems(FXCollections.observableArrayList(products));

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.getChildren().addAll(productTable, refreshBtn);

        Scene scene = new Scene(new Group());
        ((Group) scene.getRoot()).getChildren().addAll(vbox);
        stage.setScene(scene);
        stage.setWidth(300);
        stage.setHeight(500);
        stage.show();
    }

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

Notez que

productTable.setItems(FXCollections.observableArrayList(newProducts));

et 

productTable.getItems().clear();
productTable.getItems().addAll(newProducts);

sont presque équivalents. J'ai donc utilisé celui-ci pour remplir le tableau pour la première fois et l'autre lorsque le tableau est actualisé. C'est à des fins de démonstration seulement. J'ai testé le code dans JavaFX 2.1. Et enfin, vous pouvez (et devriez) modifier votre question pour l'améliorer en déplaçant les codes dans votre réponse à votre question.

7
Uluk Biy

J'ai finalement trouvé une solution de contournement laide pour actualiser toutes les lignes.

void refreshTable() {
    final List<Item> items = tableView.getItems();
    if( items == null || items.size() == 0) return;

    final Item item = tableView.getItems().get(0);
    items.remove(0);
    Platform.runLater(new Runnable(){
        @Override
        public void run() {
            items.add(0, item);
        }
    });
 }
6
Javarian

Il semble y avoir plusieurs problèmes distincts concernant oldItems.equals (newItems).

La première partie de RT-22463 : tableView ne se mettra pas à jour même si vous appelez items.clear ()

// refresh table 
table.getItems().clear();
table.setItems(listEqualToOld);    

c'est fixé. Effacer les anciens éléments avant de créer une nouvelle liste efface tout l'ancien état, rafraîchissant ainsi la table. Tout exemple où cela ne fonctionne pas pourrait être une régression.

Ce qui ne fonctionne toujours pas, c’est de redéfinir les éléments sans les effacer au préalable

// refresh table
table.setItems(listEqualToOld); 

C'est un problème si le tableau montre des propriétés qui ne sont pas impliquées dans la décision d'égalité d'un élément (voir l'exemple dans RT-22463 ou les propriétés d'Aubin ) et couvertes - espérons-le - par RT-39094

UPDATE: RT-39094 ce dernier est également corrigé, pour 8u40! Devrait bouillonner dans le ea dans quelques semaines, en spéculant sur U12 ou tel. 

La raison technique semble être un contrôle d'égalité dans l'implémentation de la cellule: la vérification des modifications de l'élément avant d'appeler réellement updateItem (T, boolean) a été introduite pour résoudre les problèmes de performances. Raisonnable, juste pour coder "changement" == old.equals (nouveau) pose des problèmes dans certains contextes. 

Une solution de rechange qui me convient (pas de test formel!) Est un TableRow personnalisé qui intervient si un contrôle d'identité est requis:

/**
 * Extended TableRow that updates its item if equal but not same.
 * Needs custom skin to update cells on invalidation of the 
 * item property.<p>
 * 
 * Looks ugly, as we have to let super doing its job and then
 * re-check the state. No way to hook anywhere else into super 
 * because all is private. <p>
 * 
 * Super might support a configuration option to check against
 * identity vs. against equality.<p>
 * 
 * Note that this is _not_ formally tested! Any execution paths calling
 * <code>updateItem(int)</code> other than through 
 * <code>indexedCell.updateIndex(int)</code> are not handled.
 * 
 * @author Jeanette Winzenburg, Berlin
 */
public class IdentityCheckingTableRow<T>  extends TableRow<T> {

    @Override
    public void updateIndex(int i) {
        int oldIndex = getIndex();
        T oldItem = getItem();
        boolean wasEmpty = isEmpty();
        super.updateIndex(i);
        updateItemIfNeeded(oldIndex, oldItem, wasEmpty);

    }

    /**
     * Here we try to guess whether super updateIndex didn't update the item if
     * it is equal to the old.
     * 
     * Strictly speaking, an implementation detail.
     * 
     * @param oldIndex cell's index before update
     * @param oldItem cell's item before update
     * @param wasEmpty cell's empty before update
     */
    protected void updateItemIfNeeded(int oldIndex, T oldItem, boolean wasEmpty) {
        // weed out the obvious
        if (oldIndex != getIndex()) return;
        if (oldItem == null || getItem() == null) return;
        if (wasEmpty != isEmpty()) return;
        // here both old and new != null, check whether the item had changed
        if (oldItem != getItem()) return;
        // unchanged, check if it should have been changed
        T listItem = getTableView().getItems().get(getIndex());
        // update if not same
        if (oldItem != listItem) {
            // doesn't help much because itemProperty doesn't fire
            // so we need the help of the skin: it must listen
            // to invalidation and force an update if 
            // its super wouldn't get a changeEvent
            updateItem(listItem, isEmpty());
        }
    }


    @Override
    protected Skin<?> createDefaultSkin() {
        return new TableRowSkinX<>(this);
    }


    public static class TableRowSkinX<T> extends TableRowSkin<T> {

        private WeakReference<T> oldItemRef;
        private InvalidationListener itemInvalidationListener;
        private WeakInvalidationListener weakItemInvalidationListener;
        /**
         * @param tableRow
         */
        public TableRowSkinX(TableRow<T> tableRow) {
            super(tableRow);
            oldItemRef = new WeakReference<>(tableRow.getItem());
            itemInvalidationListener = o -> {
                T newItem = ((ObservableValue<T>) o).getValue();
                T oldItem = oldItemRef != null ? oldItemRef.get() : null;
                oldItemRef = new WeakReference<>(newItem);
                if (oldItem != null && newItem != null && oldItem.equals(newItem)) {
                    forceCellUpdate();
                }
            };
            weakItemInvalidationListener = new WeakInvalidationListener(itemInvalidationListener);
            tableRow.itemProperty().addListener(weakItemInvalidationListener);
        }

        /**
         * Try to force cell update for equal (but not same) items.
         * C&P'ed code from TableRowSkinBase.
         */
        private void forceCellUpdate() {
            updateCells = true;
            getSkinnable().requestLayout();

            // update the index of all children cells (RT-29849).
            // Note that we do this after the TableRow item has been updated,
            // rather than when the TableRow index has changed (as this will be
            // before the row has updated its item). This will result in the
            // issue highlighted in RT-33602, where the table cell had the correct
            // item whilst the row had the old item.
            final int newIndex = getSkinnable().getIndex();
            for (int i = 0, max = cells.size(); i < max; i++) {
                cells.get(i).updateIndex(newIndex);
            }
       }

    }

    @SuppressWarnings("unused")
    private static final Logger LOG = Logger
            .getLogger(IdentityCheckingListCell.class.getName());

}

 // usage
 table.setRowFactory(p -> new IdentityCheckingTableRow());

Notez que TableCell a un contrôle d'égalité codé en dur similaire. Par conséquent, si la ligne personnalisée ne suffit pas, il peut être nécessaire d'utiliser une TableCell personnalisée avec une solution de contournement similaire (vous n'avez cependant pas rencontré d'exemple où cela est nécessaire).

3
kleopatra

Je suppose que ce fil a une très bonne description du problème avec le rafraîchissement de la table.

2
Alex

La solution de user1236048 est correcte, mais le point clé n’est pas appelé. Dans vos classes POJO utilisées pour la liste observable de la table, vous devez non seulement définir les méthodes getter et setter, mais également une nouvelle méthode appelée Property. Dans le didacticiel tableview d'Oracle ( http://docs.Oracle.com/javafx/2/ui_controls/table-view.htm ), ils ont laissé cette partie clé!

Voici à quoi devrait ressembler la classe Person:

public static class Person {

    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;
    private final SimpleStringProperty email;

    private Person(String fName, String lName, String email) {
        this.firstName = new SimpleStringProperty(fName);
        this.lastName = new SimpleStringProperty(lName);
        this.email = new SimpleStringProperty(email);
    }

    public String getFirstName() {
        return firstName.get();
    }

    public void setFirstName(String fName) {
        firstName.set(fName);
    }

    public SimpleStringProperty firstNameProperty(){
        return firstName;
    }

    public String getLastName() {
        return lastName.get();
    }

    public void setLastName(String fName) {
        lastName.set(fName);
    }

    public SimpleStringProperty lastNameProperty(){
        return lastName;
    }

    public String getEmail() {
        return email.get();
    }

    public void setEmail(String fName) {
        email.set(fName);
    }

    public SimpleStringProperty emailProperty(){
            return email;
        }

}

1
Kevin Reynolds

J'ai un cas d'utilisation où rien d'autre n'a aidé comme solution de Aubin. J'ai adapté la méthode et l'ai modifiée en supprimant et en ajoutant un élément à la liste d'éléments des tableaux, car cela ne fonctionne finalement que de manière fiable avec ce hack, la colonne à bascule visible n'a effectué le travail que la première fois.

Je l'ai signalé également dans la tâche Jira: https://javafx-jira.kenai.com/browse/RT-22463

 public <T> void tableItemsRefresh(final ObservableList<T> items) {

      if (items == null || items.size() == 0)
         return;

      int idx = items.size() -1;
      final T item = items.get(idx);
      items.remove(idx);

      new Timer().schedule(new TimerTask() {
         @Override
         public void run() {
            Platform.runLater(new Runnable() {
               @Override
               public void run() {
                  items.add(item);
               }
            });
         }
      }, 100);
   } 
1
Andreas Niemeyer

Jetez un coup d’œil à ce problème dans Jira: https://bugs.openjdk.Java.net/browse/JDK-8098085

un commentaire 2012-09-20 08:50 a donné une solution de contournement qui fonctionne.

//wierd JavaFX bug
reseller_table.setItems(null); 
reseller_table.layout(); 

ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);
1
Andrei Krasutski

J'ai eu le même problème et après quelques recherches c'est ma solution de contournement. J'ai trouvé que si les colonnes sont supprimées puis rajoutées, la table est mise à jour.

public static <T,U> void refreshTableView(final TableView<T> tableView, final List<TableColumn<T,U>> columns, final List<T> rows) {

    tableView.getColumns().clear();
    tableView.getColumns().addAll(columns);

    ObservableList<T> list = FXCollections.observableArrayList(rows);
    tableView.setItems(list);
}


Exemple d'utilisation:

refreshTableView(myTableView, Arrays.asList(col1, col2, col3), rows);
1
ceklock

Au lieu d'actualiser manuellement, vous devez utiliser les propriétés observables . Les réponses à cette question illustrent l'objectif: SimpleStringProperty et SimpleIntegerProperty TableView JavaFX

1
Andreas

Basé sur la réponse de Daniel De León 

public static void refresh_table(TableView table)
{
        for (int i = 0; i < table.getColumns().size(); i++) {
    ((TableColumn)(table.getColumns().get(i))).setVisible(false);
    ((TableColumn)(table.getColumns().get(i))).setVisible(true);
    }
}
1
Phloo

JavaFX8

J'ajoute nouvel élément par un DialogBox. Voici mon code.

ObservableList<Area> area = FXCollections.observableArrayList();

À initialize () ou setApp ()

this.areaTable.setItems(getAreaData());

getAreaData ()

private ObservableList<Area> getAreaData() {
    try {
        area = AreaDAO.searchEmployees(); // To inform ObservableList
        return area;
    } catch (ClassNotFoundException | SQLException e) {
        System.out.println("Error: " + e);
        return null;
    }
}

Ajouter par boîte de dialogue.

@FXML
private void handleNewArea() {
    Area tempArea = new Area();
    boolean okClicked = showAreaDialog(tempArea);
    if (okClicked) {
        addNewArea(tempArea);
        this.area.add(tempArea); // To inform ObservableList
    }

}

Area est un POJO JavaFX ordinaire . J'espère que cela aidera quelqu'un. 

1

Quel BUG! Voici une autre solution de contournement ...

public void forceRefresh() {
  final TableColumn< Prospect, ? > firstColumn = view.getColumns().get( 0 );
  firstColumn.setVisible( false );
  new Timer().schedule( new TimerTask() { @Override public void run() {
     Platform.runLater( new Runnable() { @Override public void run() {
        firstColumn.setVisible( true  ); }});
     }}, 100 );
}

J'ai fait un SSCCE à montrer le bogue . J'encourage tout le monde à le corriger de manière plus élégante, car ma solution est très laide!

1
Aubin

Même problème ici, j'ai essayé quelques solutions et le meilleur pour moi est le suivant:

Dans la méthode initialize du contrôleur, créez une observableList vide et définissez-la sur la table:

    obsBericht = FXCollections.observableList(new ArrayList<Bericht>(0));
    tblBericht.setItems(obsBericht);

Dans votre méthode de mise à jour, utilisez simplement observableList, effacez-la et ajoutez les données actualisées:

        obsBericht.clear();
        obsBericht.addAll(FXCollections.observableList(DatabaseHelper.getBerichte()));
//      tblBericht.setItems(obsBericht);

Il n'est pas nécessaire de redéfinir les éléments de la table

0
Tom

Je ne sais pas si cela s'applique à votre situation, mais je publierai ce qui a fonctionné pour moi.

Je change ma vue de table basée sur des requêtes/recherches dans une base de données. Par exemple, une table de base de données contient des données patient. Mon tableau initial dans mon programme contient tous les patients. Je peux ensuite rechercher une requête pour les patients par firstName et lastName. J'utilise les résultats de cette requête pour repeupler ma liste Observable. Ensuite, je réinitialise les éléments de la table en appelant tableview.setItems (observableList):

/**
 * Searches the table for an existing Patient.
 */
@FXML
public void handleSearch() {
    String fname = this.fNameSearch.getText();
    String lname = this.lNameSearch.getText();
    LocalDate bdate = this.bDateSearch.getValue();

    if (this.nameAndDOBSearch(fname, lname, bdate)) {
        this.patientData = this.controller.processNursePatientSearch(fname, lname, bdate);
    } else if (this.birthDateSearch(fname, lname, bdate)) {
        this.patientData = this.controller.processNursePatientSearch(bdate);
    } else if (this.nameSearch(fname, lname, bdate)) {
        this.patientData = this.controller.processNursePatientSearch(fname, lname);
    }

    this.patientTable.setItems(this.patientData);
}

Les blocs if mettent à jour ObservableList avec les résultats de la requête.

0
user2951579

Ma solution est similaire à la solution de contournement de Daniel De León , mais elle fonctionne également lorsque vous devez masquer la première colonne (index 0 dans son exemple). Bien sûr, vous pouvez simplement changer l'index dans sa solution, mais si vous réorganisez les colonnes, ma solution fonctionnera peut-être mieux pour vous. L'idée est de masquer et d'afficher la colonne par son nom au lieu de la masquer et de l'afficher par son index: 

private void updateMyTableView() {
    // update table view WORKAROUND !!!
    if (myTableView != null) {
        ObservableList<TableColumn<Entry, ?>> columns = myTableView.getColumns();
        for (TableColumn<Entry, ?> column : columns) {
            // at this point, we look for the specific column, which should
            // always be visible
            // therefore we use the "Column Title" String, e.g. "First name"
            if (column.getText().equals("Column Title")) {
                column.setVisible(false);
                column.setVisible(true);
            }
        }
    }
}

Il est préférable de mettre à jour votre table dans le fil de mise à jour de l'interface utilisateur. Cependant, cela fonctionne également en appelant simplement updateMyTableView(); après que vous ayez modifié quelque chose dans votre table, car JavaFX semble de toute façon se mettre à jour dans le fil de l'interface utilisateur (pas sûr de cela).

Platform.runLater(new Runnable() {
    public void run() {
         updateMyTableView();
    }
});
0
Michael

méthode initialize ()

fullNameColumn = new TableColumn("Full name");
fullNameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("fullName"));
usernameColumn = new TableColumn("Username");
usernameColumn.setCellValueFactory(new PropertyValueFactory<User, String>("test"));
emailColumn = new TableColumn("Email");
emailColumn.setCellValueFactory(new PropertyValueFactory<User, String>("email"));
reseller_table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
reseller_table.getColumns().addAll(usernameColumn, fullNameColumn, emailColumn);

ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);

Classe utilisateur (classe Hibernate POJO)

private SimpleStringProperty test;

public void setFullName(String fullName) {
  this.fullName = fullName;
  this.test = new SimpleStringProperty(fullName);    
}

public SimpleStringProperty testProperty() {
  return test;
}

méthode refresh ()

ObservableList<User> data = FXCollections.observableArrayList(User.getResellers());
reseller_table.setItems(data);
0
user1236048

Je sais que cette question a 4 ans mais j'ai le même problème, j'ai essayé les solutions ci-dessus et je n'ai pas fonctionné. J'ai aussi appelé la méthode refresh () mais je n'ai toujours pas obtenu le résultat attendu. Donc, je poste ici ma solution aidera peut-être quelqu'un.

Question db = center.getSelectionModel().getSelectedItem();
new QuestionCrud().deleteQ(db.getId());
ObservableList<Question> aftDelete = FXCollections.observableArrayList(
        (new QuestionCrud()).all()
        );
center.setItems(aftDelete);

Même avant cela, j’utilisais une autre variable dans ObeservableList pour définir des éléments dans la vue tableau, j’appelle cela une "méthode crasseuse", mais j’attends une solution plus satisfaisante.

0
Wolf Marian

Suite à la réponse de Daniel De León ... 

  • J'ai introduit une propriété fictive "modelChangedProperty" dans mon modèle et 
  • créé une méthode refresh () dans mon modèle qui modifie la valeur de cette propriété.
  • Dans mon contrôleur, j'ai ajouté un écouteur à la propriété fictive qui met à jour la vue Table. 

-

/**
 * Adds a listener to the modelChangedProperty to update the table view
 */
private void createUpdateWorkAroundListener() {

    model.modelChangedProperty.addListener(
            (ObservableValue<? extends Boolean> arg0, final Boolean oldValue, final Boolean newValue) -> updateTableView()
            );
}

/**
 * Work around to update table view
 */
private void updateTableView() {
    TableColumn<?, ?> firstColumn = scenarioTable.getColumns().get(0);
    firstColumn.setVisible(false);
    firstColumn.setVisible(true);
}
0
Stefan

J'ai essayé de trouver un moyen de rafraîchir la tableView (ScalaFx) pendant 3-4 heures. Finalement j'ai eu une réponse. Je veux juste publier ma solution parce que j'ai déjà perdu des heures. 

-Pour récupérer les lignes de la base de données, je déclarais une méthode qui renvoie ObservableBuffer.

Ma classe JDBC

    //To get all customer details
def getCustomerDetails : ObservableBuffer[Customer] = {

val customerDetails = new ObservableBuffer[Customer]()
  try {

    val resultSet = statement.executeQuery("SELECT * FROM MusteriBilgileri")

    while (resultSet.next()) {

      val musteriId = resultSet.getString("MusteriId")
      val musteriIsmi = resultSet.getString("MusteriIsmi")
      val urununTakildigiTarih = resultSet.getDate("UrununTakildigiTarih").toString
      val bakimTarihi = resultSet.getDate("BakimTarihi").toString
      val urununIsmi = resultSet.getString("UrununIsmi")
      val telNo = resultSet.getString("TelNo")
      val aciklama = resultSet.getString("Aciklama")

      customerDetails += new Customer(musteriId,musteriIsmi,urununTakildigiTarih,bakimTarihi,urununIsmi,telNo,aciklama)

    }
  } catch {
    case e => e.printStackTrace
  }

  customerDetails
}

-Et j'ai créé un objet TableView. 

var table = new TableView[Customer](model.getCustomerDetails)
table.columns += (customerIdColumn,customerNameColumn,productInstallColumn,serviceDateColumn,
        productNameColumn,phoneNoColumn,detailColumn)

-Et enfin j'ai eu la solution. Dans le bouton d'actualisation, j'ai inséré ce code; 

table.setItems(FXCollections.observableArrayList(model.getCustomerDetails.delegate))

le modèle est la référence de ma classe de connexion jdbc

val model = new ScalaJdbcConnectSelect

Ce sont les codes scalafx mais cela donne une idée de javafx

0

Bien après avoir cherché toutes les solutions possibles. Essayé d'effacer les données d'abord et ensuite ajouté dans tableview tableView.getItems().clear(); toujours qui n'a pas résolu mon problème. J'ai essayé toutes les réponses données ici, mais cela n'a pas fonctionné pour moi et j'avais toujours des objets périmés dans mon tableau, comme le montre l'image ci-dessous:

 enter image description here

Afin de résoudre ce problème, j'ai créé une étiquette DUMMY et utilisé setGraphic comme suit:

 enter image description here

0
Vishrant