2016-07-20 2 views
0

カスタムListCellを使用して、ListViewでカスタムオブジェクトを表示しようとしています。問題を示す例として、java.util.Fileを選択しました。また、デモンストレーションの目的で、レンダリング時にListCellを直接無効にします。項目は、スレッドによってシミュレートされた外部プロセスによって追加されます。私が無効にしたListCellに色付けするCSSを適用するまで、すべてがうまく見えます。これで、作成されたListCellと一緒に無効になるゴーストアイテムがあるようです。javafxのGhostアイテムカスタムListCellを使用したListView

どうすればこの問題を解決できますか?

App.java

public class App extends Application 
{ 
    @Override 
    public void start(Stage primaryStage) 
    { 
     final ListView<File> listView = new ListView<>(); 
     listView.setCellFactory(column -> { 
      return new ListCell<File>() 
      { 
       protected void updateItem(File item, boolean empty) 
       { 
        super.updateItem(item, empty); 

        if(item == null || empty) 
        { 
         setGraphic(null); 
         return; 
        } 

        setDisable(true);     
        setGraphic(new TextField(item.getName())); 
       } 
      }; 
     }); 

     new Thread(() -> { 
      for(int i=0 ; i<10 ; ++i) 
      { 
       try 
       { 
        Thread.sleep(1000); 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 
       } 
       final int n = i; 
       Platform.runLater(() -> { 
        listView.getItems().add(new File(Character.toString((char)((int) 'a' + n)))); 
       }); 
      }  
     }).start(); 

     Scene scene = new Scene(listView);  
     scene.getStylesheets().add("app.css"); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    @Override 
    public void stop() throws Exception 
    { 
     super.stop(); 
    } 

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

あなたが戻っfalseからdisableプロパティを設定することはありませんapp.css

.list-cell:disabled { 
    -fx-background-color: #ddd; 
} 

答えて

1

。これは空のセルに対して行う必要があります。

  1. 項目がCellに追加され、セルは、アイテムがCellから削除され
  2. 無効になっている、Cellが空になるが、それは無効のまま:以下はCellに発生する可能性があります。一般に

Cellが空になったときに、アイテムが追加されたときCellに行った変更を元に戻すべきです。

さらに、Cellに新しいアイテムが割り当てられるたびに、TextFieldを再作成しないでください。

listView.setCellFactory(column -> { 
    return new ListCell<File>() { 

     private final TextField textField = new TextField(); 

     protected void updateItem(File item, boolean empty) { 
      super.updateItem(item, empty); 

      if (item == null || empty) { 
       setDisable(false); 
       setGraphic(null); 
      } else { 
       setDisable(true); 
       textField.setText(item.getName()); 
       setGraphic(textField); 
      } 
     } 
    }; 
}); 
+0

ありがとうございます!あなたが私の精神的なブロックを解放したかのように見えます。私は明日までそれをテストすることはできませんが、私はこれが問題を解決することを確信しています。毎回ビジュアルアイテムを再作成しないことのヒントは非常に便利ですが、この場合はデモンストレーションが必要です。 – DaRich

+0

リテイルの注釈:空のアイテム 'disableProperty()。unbind()'のバインドされたプロパティもリセットする必要があります。 – DaRich

+0

@DaRich:はい、アイテムを追加したときにバインドする場合のみです。アイテムを追加するときに行ったすべての変更を元に戻すだけです... – fabian

関連する問題