2016-07-05 10 views
1

Es tut mir leid für Fehler Ich bin Französisch. Also ich habe ein TableView leer. Ich habe eine Schaltfläche "Hinzufügen", wenn Sie auf eine Zeile in einer Tabellenansicht klicken. Und wenn ich in meiner Tabellenansicht eine Zeile auswähle, erscheint eine neue Schaltfläche "Abbrechen". Und wenn ich auf die Schaltfläche "Abbrechen" klicke, ändert sich die CSS-Zeile der Zeile in meiner ausgewählten Zeile (fügte eine Klasse css ".cancel" hinzu).Ändern css für eine neue Zeile in TableView hinzugefügt Javefx

Das Problem ist, dass ich auf den Button "Abbrechen" klicke, und nachdem ich in den Button "Hinzufügen" geklickt habe, wird der CSS ".cancel" in einer anderen Zeile angewendet, während ich nicht geklickt habe ".

Ich denke, dass es ein Problem in der Indexreihe gibt.

In meiner Methode initialisieren:

articleTable.setRowFactory(param -> new TableRow<LigneTicket>() { 
     @Override 
     protected void updateItem(LigneTicket paramT, boolean empty) { 
      super.updateItem(paramT, empty); 
      if (!isEmpty() && paramT != null && paramT.getArticle().isArticleCanceled()) { 
       getStyleClass().add("cancel"); 
      } 
     } 
    }); 

meinen Code auf die Schaltfläche "Abbrechen":

public void cancelLigneTicket() { 
    int indexSelected = articleTable.getSelectionModel().getSelectedIndex(); 
        articleTable.getItems().get(indexSelected).getArticle().setArticleAnnuler(true); 

articleTable.getSelectionModel().clearSelection(); 

List<LigneTicket> items = new ArrayList<>(articleTable.getItems()); 

articleTable.getItems().setAll(items); 

buttonAnnulArt.setVisible(false); 

Hilfe !!

Danke.

+0

Haben Sie jemals die Stilklasse 'cancel' entfernt? Auch - Sie sind wahrscheinlich besser dran mit Pseudo-Klasse, siehe http://stackoverflow.com/questions/37072514/how-to-add-class-or-pseudoclass-programmatical-to-custom-control-in-javafx und http: //stackoverflow.com/questions/36883838/implement-read-only-style-in-javafx/36886291#36886291 – Itai

+0

Nein Ich entferne nicht die Klasse "Abbrechen", weil jede Zeile ausgewählt und nach dem Klicken in der Schaltfläche "Abbrechen" muss die Klasse css "abbrechen". Ich habe durch den Code "pseudoClassStateChanged (PseudoClass.getPseudoClass (" cancel "), true) ersetzen;", aber ich arbeite nicht ... – Benj

+0

Ich bin mir nicht sicher, dass ich verstehe, dass Sie meinen, aber bedenken Sie, dass ' TableView' verwendet Zeilen erneut. Wenn Sie also eine Eigenschaft für das Zeilenobjekt festgelegt haben, müssen Sie sicherstellen, dass sie mit jedem 'updateItem' noch gültig ist - die gleiche Zeile kann jetzt für ein Element verwendet werden, das nicht abgebrochen wurde! Auch - was meinst du damit Pseudo-Klasse funktioniert nicht? Das gleiche Problem, oder nicht Stil überhaupt ändern? Denken Sie daran, Pseudo-Klassen müssen angegeben werden durch: (Doppelpunkt) in der CSS, nicht.(Periode), so sollte es ": Abbrechen" anstatt ".cancel" sein. – Itai

Antwort

1

TableRow s werden verwendet, um die Tabellenelemente anzuzeigen. Das bedeutet jedoch nicht, dass es nur mit einem Gegenstand verwendet wird.

Dies kann für eine Zeile in der folgenden Reihenfolge von Ereignissen führt r:

  1. Der Artikel von r zu abgebrochenem Elemente aktualisiert wird und somit die cancel CSS-Klasse hinzugefügt wird.
  2. Der Artikel r wird auf einen nicht stornierten Artikel aktualisiert, aber die CSS-Klasse cancel wird nicht entfernt.

Sie müssen die Klasse wieder entfernen. Außerdem könnte die Stilklasse mit Ihrem Code mehrfach hinzugefügt werden, was zu unnötigem Speicherverbrauch führt.

boolean canceled = !empty && paramT != null && paramT.getArticle().isArticleCanceled()); 
if (canceled) { 
    if (!getStyleClass().contains("cancel")) 
      getStyleClass().add("cancel"); 
} else { 
    getStyleClass().remove("cancel"); 
} 

oder mit PseudoClass:

private static final PseudoClass CANCELED = PseudoClass.getPseudoClass("cancel"); 

... 
pseudoClassStateChanged(CANCELED, !empty && paramT != null && paramT.getArticle().isArticleCanceled()); 

Außerdem sollten Sie die TableView.refresh (erhältlich in JavaFX> = 8u60) bevorzugen Verfahren die Zelle Elemente zu aktualisieren, anstatt die Liste zu kopieren und die Einstellungen vorgenommen haben.

+0

Es funktioniert beim Hinzufügen von "tableView.refresh". Danke so matschig – Benj