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;
}
ありがとうございます!あなたが私の精神的なブロックを解放したかのように見えます。私は明日までそれをテストすることはできませんが、私はこれが問題を解決することを確信しています。毎回ビジュアルアイテムを再作成しないことのヒントは非常に便利ですが、この場合はデモンストレーションが必要です。 – DaRich
リテイルの注釈:空のアイテム 'disableProperty()。unbind()'のバインドされたプロパティもリセットする必要があります。 – DaRich
@DaRich:はい、アイテムを追加したときにバインドする場合のみです。アイテムを追加するときに行ったすべての変更を元に戻すだけです... – fabian