Échec de l'affichage des couleurs dans la table JavaFX


J'ai développé une application en Java-JavaFX. Cela fonctionne parfaitement sur plusieurs comoputers (environ 20), mais il y en a un qui ne montre pas la couleur des lignes dans le tableau. Tous les ordinateurs sont des wiindows avec plusieurs versioins. celui qui échoue est un Winndows 7 64bit. Voici mon code

public TableRow<Orden> call(TableView<Orden> tableView) {

    final TableRow<Orden> row = new TableRow<Orden>() {
        @Override
        protected void updateItem(Orden orden, boolean empty){
            super.updateItem(orden, empty);

            if(null!=orden) {
                clearPriorityStyle();
                String color = calcularColorRow(orden);
                if(!color.equals("")){
                    this.getStyleClass().add(color);

                }

            }

        }

        private String calcularColorRow(Orden o){
            if(null!=o.getmColorCode()){
                Integer colorCode = o.getmColorCode();
                switch(colorCode){
                case 0:
                    return "";

                case 1:
                    return "rojo";

                case 2:
                    return "verde";

                case 3:
                    return "naranja";

                case 4:
                    return "amarillo";

                case 5:
                    return "azul";
                case 6:
                    return "morado";

                default: 
                    return "";
                }
            } else {
                return "";
            }
        }

        private void clearPriorityStyle(){
            ObservableList<String> styleClasses = getStyleClass();
            this.getStyleClass().remove("rojo");
            styleClasses.remove("naranja");
            styleClasses.remove("verde");
            styleClasses.remove("amarillo");
            styleClasses.remove("azul");
            styleClasses.remove("morado");
        }
    };

Et le .le code css:

@CHARSET "UTF-8";
.amarillo {
    -fx-control-inner-background: khaki;
-fx-text-fill: blue;
-fx-background-insets: 0, 1, 2;
-fx-text-fill: -fx-selection-bar-text;
}

.errorRow {
    -fx-control-inner-background: green;

-fx-background-insets: 0, 1, 2;
-fx-text-fill: -fx-selection-bar-text;
}
.verde { 
  -fx-control-inner-background: palegreen;
  -fx-accent: derive(-fx-control-inner-background, -40%);
  -fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}

.azul { 
  -fx-control-inner-background: plum;
  -fx-accent: derive(-fx-control-inner-background, -40%);
  -fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}

.naranja { 
  -fx-control-inner-background: coral;
  -fx-accent: derive(-fx-control-inner-background, -40%);
  -fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}
.rojo { 
  -fx-control-inner-background: red;
  -fx-accent: derive(-fx-control-inner-background, -40%);
  -fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}
.morado { 
  -fx-control-inner-background: purple;
  -fx-accent: derive(-fx-control-inner-background, -40%);
  -fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}
.marron { 
  -fx-control-inner-background: brown;
  -fx-accent: derive(-fx-control-inner-background, -40%);
  -fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}
Author: James_D, 2016-10-13

1 answers

Il y a quelques bogues dans votre implémentation d'usine de lignes de table:

  1. getStyleClass() renvoie une liste, qui peut bien sûr contenir des éléments en double. Vous devez donc vous assurer que vous n'ajoutez pas le même élément deux fois. La façon la plus simple de le faire est de supprimer toutes les couleurs de la liste des classes de style chaque fois que updateItem(...) est appelé, puis ajoutez simplement celle dont vous avez besoin.
  2. Vous ne gérez pas actuellement le cas vide: ici, vous voulez vous assurer de supprimer l'une des classes de style que vous ajouter.

Vous pouvez les réparer d'un seul coup. D'abord noter que, si list.remove(item) supprime la première occurrence de item à partir d'une liste, list.removeAll(collection) va supprimer tous les éléments de dans la liste qui appartiennent à la collection. Deuxièmement, assurez-vous d'appeler clearPriorityStyle() même si la ligne de la table est vide.

Différentes versions de JavaFX peuvent implémenter les mises à jour de la table différemment, donc la raison probable pour laquelle vous voyez des comportements différents est qu'une machine utilise une version qui expose ces bogues, tandis que d'autres utilisent une version dont l'implémentation fonctionne simplement avec votre code. Voici une solution:

public TableRow<Orden> call(TableView<Orden> tableView) {

    final TableRow<Orden> row = new TableRow<Orden>() {

        final List<String> allStyles = Arrays.asList(
            "", 
            "rojo", 
            "naranja", 
            "verde", 
            "amarillo", 
            "azul", 
            "morado");

        @Override
        protected void updateItem(Orden orden, boolean empty){
            super.updateItem(orden, empty);

            clearPriorityStyle();

            if(null!=orden) {
                String color = calcularColorRow(orden);
                if(!color.equals("")){
                    this.getStyleClass().add(color);

                }

            }

        }

        // same as before but a cleaner implementation:
        private String calcularColorRow(Orden o){
            if(null!=o.getmColorCode()){
                int colorCode = o.getmColorCode();
                if (colorCode < allStyles.size()) {
                    return allStyles.get(colorCode);
                }
            } 
            return "" ;
        }   


        private void clearPriorityStyle(){
            ObservableList<String> styleClasses = getStyleClass();
            this.getStyleClass().removeAll(allStyles);
        }

    };

    return row ;
}
 0
Author: James_D, 2016-10-17 10:43:55