2013-07-03 71 views
0

繼甲骨文的一個ListView例如顯示顏色,我已經能夠得到一個ComboBox顯色色的列表了JavaFx 2 - 在組合框

enter image description here

我的問題是,一旦顏色選擇,ComboBox會顯示字符串名稱,而我想顯示顏色本身,不論顏色名稱是否存在。

如何更改此代碼以顯示所選顏色?

謝謝大家。

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.ContentDisplay; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 
import javafx.util.Callback; 


public class ProvaComboRendering extends Application { 

@Override 
public void start(Stage primaryStage) { 


    StackPane root = new StackPane(); 
    ComboBox<String> cb = new ComboBox<String>(); 

    cb.setPrefSize(150, 20); 
    root.getChildren().add(cb); 


    Scene scene = new Scene(root, 300, 250); 

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

ObservableList<String> data = FXCollections.observableArrayList(
     "chocolate", "salmon", "gold", "coral", "darkorchid", 
     "darkgoldenrod", "lightsalmon", "black", "rosybrown", "blue", 
     "blueviolet", "brown"); 

    cb.setItems(data); 

    cb.setCellFactory(new Callback<ListView<String>, ListCell<String>>(){ 
     @Override 
     public ListCell<String> call(ListView<String> list){ 
      return new ColorRectCell(); 
     } 

    }); 
} 
    static class ColorRectCell extends ListCell<String>{ 
     @Override 
     public void updateItem(String item, boolean empty){ 
      super.updateItem(item, empty); 
      Rectangle rect = new Rectangle(120,18); 
      if(item != null){ 
       rect.setFill(Color.web(item)); 
       setGraphic(rect); 
     } 
    } 
    } 

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

編輯:難道不可能性,以顯示工具提示displaing顏色的名稱在鼠標指針是在顏色列表中的一個?

enter image description here

回答

2

使用組合框的鈕釦電池性能。您可以使用相同的cellfactory:

@Override 
public void start(Stage primaryStage) { 
    StackPane root = new StackPane(); 
    ComboBox<String> cb = new ComboBox<String>(); 

    cb.setPrefSize(150, 20); 
    root.getChildren().add(cb); 

    Scene scene = new Scene(root, 300, 250); 

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

    ObservableList<String> data = FXCollections.observableArrayList(
      "chocolate", "salmon", "gold", "coral", "darkorchid", 
      "darkgoldenrod", "lightsalmon", "black", "rosybrown", "blue", 
      "blueviolet", "brown"); 

    cb.setItems(data); 

    Callback<ListView<String>, ListCell<String>> factory = new Callback<ListView<String>, ListCell<String>>() { 
     @Override 
     public ListCell<String> call(ListView<String> list) { 
      return new ColorRectCell(); 
     } 
    }; 

    cb.setCellFactory(factory); 
    cb.setButtonCell(factory.call(null)); 

} 

或定義一個新的電池工廠扣式電池,像下面增加了一個tooltipablity:

@Override 
public void start(Stage primaryStage) { 
    StackPane root = new StackPane(); 
    ComboBox<String> cb = new ComboBox<String>(); 

    cb.setPrefSize(150, 20); 
    root.getChildren().add(cb); 

    Scene scene = new Scene(root, 300, 250); 

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

    ObservableList<String> data = FXCollections.observableArrayList(
      "chocolate", "salmon", "gold", "coral", "darkorchid", 
      "darkgoldenrod", "lightsalmon", "black", "rosybrown", "blue", 
      "blueviolet", "brown"); 

    cb.setItems(data); 

    Callback<ListView<String>, ListCell<String>> factory = new Callback<ListView<String>, ListCell<String>>() { 
     @Override 
     public ListCell<String> call(ListView<String> list) { 
      return new ColorRectCell(); 
     } 
    }; 
    cb.setCellFactory(factory); 

    Callback<ListView<String>, ListCell<String>> factoryTooltip = new Callback<ListView<String>, ListCell<String>>() { 
     @Override 
     public ListCell<String> call(ListView<String> list) { 
      return new ColorRectTooltipCell(); 
     } 
    }; 
    cb.setButtonCell(factoryTooltip.call(null)); 

} 


static class ColorRectTooltipCell extends ColorRectCell { 
    @Override 
    public void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); 
     if (item != null) { 
      Tooltip.install(this.getParent(), new Tooltip(item)); 
     } 
    } 
} 
+0

非常感謝您! –

+0

@Albertoacepsut。根據您更新的問題查看更新。 –

+0

再次感謝! –