2016-10-06 10 views
0

バグであれば、何かが欠けているかどうかわからない/サポートされていません。私はツリーアイテムの背景色をupdateItem-Methodで設定しようとしています。しかし、私が周りをスクロールすると、他のツリーアイテムも色付きになります。JavaFX TreeView cellFactoryスタイリングバグ

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

サンプル出力:

enter image description here

答えて

1

あなたはTreeCellが空になるか、アイテムが1つに置き換えた場合にはスタイリングを元に戻すのを忘れて

は、ここでのコード問題を再現するのです黄色にする必要はありません。

@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

はありがとう:セルが空になるかnull項目が含まれている場合も、あなたは、テキストを削除しないでください!もちろん。時には木の木が見えなくなることがあります。 –

+0

updateItemはラッパーのようなセルそのものを参照しており、コンテンツが変更されたときに更新する必要があることを理解しています。しかし、なぜ私には(技術的に)他の細胞が色づけされているのか分かりません。 –

+0

@Michael_S:スクロールすると、項目が別のセルに割り当てられます。これは、コンテンツを表示するために使用される 'Node'の数を制限するために行われます。 (TreeViewには可視の「行」ごとに1つのセルしかありませんが、展開された祖先(可視アイテム)を持つノードは任意に大きくすることができます。 – fabian

関連する問題