2016-10-03 8 views
2

すべてのセルにカスタム背景色を追加するために、CheckBoxListCellの使用例を変更しようとしています。ここでは、私がこれまでにやった」とは何ですが、あなたがすべてでカスタムセルクラスを使用していないので、無駄JavaFx 8でカスタム背景色でCheckBoxListCellを作成

// ListViewCheckBoxEditing.java 
package application; 

import java.util.HashMap; 
import java.util.Map; 
import javafx.application.Application; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.beans.value.ObservableValue; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ListView; 
import javafx.scene.control.SelectionMode; 
import javafx.scene.control.cell.CheckBoxListCell; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class ListViewCheckBoxEditing extends Application { 
    Map<String, ObservableValue<Boolean>> map = new HashMap<>(); 

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

    @Override 
    public void start(Stage stage) { 
     // Populate the map with ListView items as its keys and 
     // their selected state as the value 
     map.put("Apple", new SimpleBooleanProperty(false)); 
     map.put("Banana", new SimpleBooleanProperty(false)); 
     map.put("Donut", new SimpleBooleanProperty(false)); 
     map.put("Hash Brown", new SimpleBooleanProperty(false)); 

     ListView<String> breakfasts = new ListView<>(); 
     breakfasts.setPrefSize(200, 120); 
     breakfasts.setEditable(true); 
     breakfasts.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

     // Add all keys from the map as items to the ListView  
     breakfasts.getItems().addAll(map.keySet()); 

     // Create a Callback object 
     Callback<String, ObservableValue<Boolean>> itemToBoolean = (String item) -> map.get(item); 

     // Set the cell factory to my CheckBoxListCell implementation 
     breakfasts.setCellFactory(MyCell.forListView(itemToBoolean)); 

     Button printBtn = new Button("Print Selection"); 
     printBtn.setOnAction(e -> printSelection()); 

     VBox root = new VBox(new Label("Breakfasts:"), breakfasts, printBtn); 
     Scene scene = new Scene(root);  
     stage.setScene(scene);  
     stage.setTitle("Using ListView Cell Factory"); 
     stage.show(); 
    } 

    public void printSelection() { 
     System.out.println("Selected items: "); 
     for(String key: map.keySet()) { 
      ObservableValue<Boolean> value = map.get(key); 
      if (value.getValue()) { 
       System.out.println(key);   
      } 
     } 

     System.out.println(); 
    } 

    public class MyCell extends CheckBoxListCell<String>{ 
     public MyCell(){ 
      super(); 
     } 

     @Override 
     public void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 
      // I would expect the following to work 
      setStyle("-fx-background-color: yellow;"); 
     } 
    } 
} 
+0

それは本当に楽しいの変化を見ることが可能この問題を示す実際の[MCVE]を含むよく書かれた質問。アップボーニング。 –

+0

お返事ありがとうございます。公正であるために、この例は[この本](http://www.apress.com/9781484211434)からハッキングされました –

答えて

3

静的メソッド呼び出しMyCell.forListView(..)に単に、方法CheckBoxListCell.forListView(...)を呼び出します。

// Set the cell factory to my CheckBoxListCell implementation 

Callback<ListView<String>, ListCell<String>> defaultCellFactory = CheckBoxListCell.forListView(itemToBoolean); 

breakfasts.setCellFactory(lv -> { 
    ListCell<String> cell = defaultCellFactory.call(lv); 
    cell.setStyle("-fx-background-color: yellow"); 
    return cell ; 
}); 

をし、完全にあなたのセルの実装を削除します。あなたが望む機能については

、あなたは単にそのメソッドから返されるセルのスタイルを変更することができます。

あなたが本当にupdateItem(...)メソッドのオーバーライドを必要とすることがより複雑なものを、必要な場合は、あなたがあなたの細胞サブクラスのインスタンスを返すためにコールバックを実装する必要があります。

import java.util.HashMap; 
import java.util.Map; 

import javafx.application.Application; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.beans.value.ObservableValue; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.scene.control.SelectionMode; 
import javafx.scene.control.cell.CheckBoxListCell; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class ListViewCheckBoxEditing extends Application { 
    Map<String, ObservableValue<Boolean>> map = new HashMap<>(); 

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

    @Override 
    public void start(Stage stage) { 
     // Populate the map with ListView items as its keys and 
     // their selected state as the value 
     map.put("Apple", new SimpleBooleanProperty(false)); 
     map.put("Banana", new SimpleBooleanProperty(false)); 
     map.put("Donut", new SimpleBooleanProperty(false)); 
     map.put("Hash Brown", new SimpleBooleanProperty(false)); 

     ListView<String> breakfasts = new ListView<>(); 
     breakfasts.setPrefSize(200, 120); 
     breakfasts.setEditable(true); 
     breakfasts.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

     // Add all keys from the map as items to the ListView  
     breakfasts.getItems().addAll(map.keySet()); 

     // Create a Callback object 
     Callback<String, ObservableValue<Boolean>> itemToBoolean = (String item) -> map.get(item); 

     // Set the cell factory to my CheckBoxListCell implementation 
     breakfasts.setCellFactory(lv -> new MyCell(itemToBoolean)); 

     Button printBtn = new Button("Print Selection"); 
     printBtn.setOnAction(e -> printSelection()); 

     VBox root = new VBox(new Label("Breakfasts:"), breakfasts, printBtn); 
     Scene scene = new Scene(root);  
     stage.setScene(scene);  
     stage.setTitle("Using ListView Cell Factory"); 
     stage.show(); 
    } 

    public void printSelection() { 
     System.out.println("Selected items: "); 
     for(String key: map.keySet()) { 
      ObservableValue<Boolean> value = map.get(key); 
      if (value.getValue()) { 
       System.out.println(key);   
      } 
     } 

     System.out.println(); 
    } 

    public class MyCell extends CheckBoxListCell<String>{ 
     public MyCell(Callback<String, ObservableValue<Boolean>> getSelectedProperty){ 
      super(getSelectedProperty); 
     } 

     @Override 
     public void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 
      // I would expect the following to work 
      setStyle("-fx-background-color: yellow;"); 
     } 
    } 
} 
+0

今や意味があります!私はカスタムクラスと一緒に行くつもりですありがとう! –

関連する問題