67 votes

Éléments d'actualisation JavaView TableView

J'ai ce problème commun, car elle semble être. Ma table de visualiser l'habitude de me rafraîchir les éléments après que j'ai de les réinitialiser. J'ai vérifié les données et c'est le nouveau.

J'ai essayé plusieurs solution à partir d'internet, mais sans succès.

Ne pouvez pas réinitialiser toutes les colonnes, car il ajoute un vide supplémentaire (je ne sais pas pourquoi) et le redimensionner juste bat.

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

Les données sont actualisées si je modifier l'ordre des éléments et les lignes de changement (:|).

Je suis juste parti sans idées.

Au moment de l'actualisation du code est assez simple.

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

De nouveau, les nouvelles données sont correctes. Quand je fais une sélection à la tableView il renvoie le nouvel Élément correct.

63voto

Daniel De León Points 2842

Solution de contournement:

  tableView.getColumns().get(0).setVisible(false);
 tableView.getColumns().get(0).setVisible(true);
 

45voto

Ingo Points 141

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

Supposons ObservableList obsList est la liste sous-jacente pour la TableView.

Alors
obsList.clear() (héritée de java.util.List<>) sera pas de mise à jour de la tableView correctement mais.

Aussi appel setItem(obsList) n'a pas de travail pour déclencher une actualisation...mais...

obsList.removeAll(obsList) (remplacé par ObservableList) fonctionne très bien , car il déclenche l'changeEvent correctement :-)

Remplissage d'une liste de complètement nouveau contenu fonctionne alors comme suit:

  • obsList.removeAll(obsList);
  • obsList.ajouter(...); //par exemple, dans une boucle...

ou

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

En ce qui concerne meilleur Ingo

11voto

Uluk Biy Points 15426

A propos de l'actualisation de voir la mise à Jour des lignes dans Tableview.
Et à propos de la colonne vide voir le JavaFx 2 créer TableView avec une seule colonne. Fondamentalement, il n'est pas une colonne, c'est à dire vous ne pouvez pas sélectionner l'élément en cliquant sur ce vide éléments de la colonne. C'est juste un espace vide comme un style de ligne.


Mise à JOUR: Si vous êtes à la mise à jour de la tableView via reseller_table.setItems(data) , alors vous n'avez pas besoin d'utiliser SimpleStringProperty. Il serait utile si vous avez été la mise à jour d'une ligne/point seulement. Voici un exemple complet de l'actualisation de la table des données:

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 à peu près équivalents. J'ai donc utilisé l'un pour remplir la table pour la première fois et d'autres lorsque le tableau est actualisé. Il est pour fins de démonstration uniquement. J'ai testé le code dans JavaFX 2.1. Et enfin, vous pouvez (et devriez) de modifier une question à l'améliorer en déplaçant les morceaux de code dans votre réponse à votre question.

6voto

Javarian Points 31

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);
        }
    });
 }
 

2voto

Alex Points 308

Je suppose que cette bande de roulement est très bonne décrire le problème avec l'actualisation de la table.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X