2016-07-20 13 views
0

私はいくつかの値(ListItem)を持つクラスを持っており、これらの項目のリスト(ListView<ListItem>)を表示したいと思います。 ListItemvalueというプロパティを持っていますが、ListView<ListItem>のテキストとして表示することをお勧めします。それ以外の場合は、特にアイテムの選択に関して、通常のように表示され、機能するはずです。私はこれを達成するために次のコードを持っています。 FXMLは怠惰から省かれており、それはちょうど<ListView />です。JavaFX ListView CellFactoryは項目の選択を無効にします

// Controller for FXML 
public class MainController { 
    // Wrapper class containing several values 
    private class ListItem { 
     private String value; 

     public ListItem(String value) { 
      this.value = value; 
     } 

     public String getValue() { 
      return value; 
     } 

     ... // Other useful stuff 
    } 

    @FXML private ListView<ListItem> list; 

    @FXML 
    public void initialize() { 
     // Set list to display using the given CellFactory 
     list.setCellFactory((list) -> { 
      return new ListCell<ListItem>() { 
       @Override 
       protected void updateItem(ListItem item, boolean empty) { 
        if (empty) return; 

        // Display item's value property 
        setText(item.getValue()); 
       } 
      }; 
     }); 

     // Add test data 
     list.getItems().add(new ListItem("test")); 
     list.getItems().add(new ListItem("test2")); 

     // Print when selection changes 
     list.getSelectionModel().selectedItemProperty().addListener((evt) -> { 
      System.out.println("Selection changed!"); 
     }); 
    } 
} 

これはListViewの各項目内のそのvalueプロパティを使用して、正しくListItemを表示します。ただし、選択が解除され、System.out.println(...)は実行されません(この項目では、もGUIではではありません)。私はlist.setCellFactory(...)のステートメントを削除することが原因であることを発見しましたが、私は窮地に陥ります。

list.setCellFactory(...)が存在する場合、アイテムは正しいテキストを使用するが、を選択することができません。 list.setCellFactory(...)が存在しない場合、項目はの間違ったテキストを使用しますが、となります。テキストを正しく表示するために何か特別なことがありますか?アイテムを選択しますか?

私は前提条件のグーグルを行っていますが、この特定の問題を持つ他の人は見つかりませんでした。どんな助けでも大歓迎です。

+0

アイテムが削除されたときのセル。それ以外の場合は、次のような問題が発生します。http://stackoverflow.com/q/38483552/2991525空のセルに対して 'text'を' null'または '' ''に設定してください。 – fabian

答えて

3

あなたはupdateItem(...)の最初の行として

super.updateItem(item, empty); 

を追加する必要があります。このコールは、常にがオーバーライドされたCell.updateItem(...)メソッドに存在する必要があります(updateIndex(...)などの他のupdateXXXメソッドでも同じです)。また

、また、あなたのupdateItem(...)方法は、細胞が空である場合を含め、正確にすべてのケースを扱うことを確認してください。それが行われた変更を元に戻すことをお勧めしますJames_Dの答えに加えて

protected void updateItem(ListItem item, boolean empty) { 
    super.updateItem(item, empty); 
    if (empty) { 
     setText(null); 
    } else { 
     // Display item's value property 
     setText(item.getValue()); 
    } 
} 
+0

パーフェクト。それがまさに問題でした。私はC#に精通しており、ラムダのように考えていたので、スーパークラスを呼び出すことは私には起こりませんでした。ヘルプと「空の」ケースについてのアドバイスをありがとう。 –