2016-10-06 4 views
0

Ich bin mir nicht sicher, ob ich etwas vermisse, wenn es ein Fehler/nicht unterstützt wird. Ich versuche die Hintergrundfarbe eines Treeitems mit der updateItem-Methode zu setzen. Aber wenn ich herum scrolle, werden auch andere Baumelemente koloriert.JavaFX TreeView CellFactory Styling Fehler

Hier Code, um das Problem zu reproduzieren:

public class Main extends Application 
{ 

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

    @Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     StackPane root = new StackPane(); 
     TreeView<String> treeView = new TreeView<String>(getTree()); 

     treeView.setCellFactory(tv -> new TreeCell<String>() 
     { 
      @Override 
      protected void updateItem(String item, boolean empty) 
      { 
       super.updateItem(item, empty); 

       if (item != null) 
       { 
        setText(item); 

        if (item.equals("c5")) 
        { 
         setStyle("-fx-background-color: YELLOW"); 
        } 

       } 
      } 
     }); 

     root.getChildren().add(treeView); 

     primaryStage.setScene(new Scene(root, 300, 250)); 
     primaryStage.show(); 
    } 

    private TreeItem<String> getTree() 
    { 
     TreeItem<String> root = new TreeItem<>("root"); 
     TreeItem<String> a = new TreeItem<String>("a"); 
     TreeItem<String> b = new TreeItem<String>("b"); 
     TreeItem<String> c = new TreeItem<String>("c"); 

     root.getChildren().add(a); 
     root.getChildren().add(b); 
     root.getChildren().add(c); 

     for (int i = 0; i < 100; i++) 
     { 
      c.getChildren().add(new TreeItem<String>("c" + i)); 
     } 

     return root; 
    } 
} 

Beispielausgabe:

enter image description here

Antwort

1

Sie haben vergessen, das Styling im Fall rückgängig zu machen ein TreeCell geleert wird oder der Gegenstand mit einer ersetzt wird, sollte nicht gelb gestylt sein. Auch entfernen Sie nicht Text, wenn die Zelle leer ist oder enthält einen null Artikel:

@Override 
protected void updateItem(String item, boolean empty) { 
    super.updateItem(item, empty); 
    if (empty || item == null) { 
     setText(null); 
     // clear background 
     setStyle(null); 
    } else { 
     setText(item); 
     if (item.equals("c5")) { 
      setStyle("-fx-background-color: YELLOW"); 
     } else { 
      // clear background 
      setStyle(null); 
     } 
    } 
} 
+0

Vielen Dank! Na sicher. Manchmal verlierst du den Wald für die Bäume aus den Augen .... –

+0

Ich verstehe, dass das updateItem die Zelle selbst wie einen Wrapper bezeichnet und du sie aktualisieren musst, wenn sich der Inhalt ändert. Aber es ist mir (technisch) immer noch nicht klar, warum es mehrere andere Zellen gibt, die koloriert werden, anstatt nur eine. –

+0

@Michael_S: Beim Scrollen werden Elemente verschiedenen Zellen zugewiesen. Dies wird gemacht, um die Anzahl von Knoten zu begrenzen, die zum Anzeigen des Inhalts verwendet werden. (Es gibt nur eine Zelle pro sichtbare "Zeile" in der "TreeView", aber die Anzahl der Knoten mit nur erweiterten Vorfahren (= sichtbare Elemente) kann beliebig groß sein.) – fabian

Verwandte Themen