以下範例分別示範以文字字串與顏色選項修改Combo Box的選項項目,第一個複合方塊設定為文字字串之選項項目,以setCellFactory()方法設定其Cell Factory,並在Cell Factory中分別設定各選項項目的文字顏色:
String title[] = new String[10];
for (int i=0; i < 10; i++)
title[i] = "Item " + i;
final ComboBox combobox1 = new ComboBox();
combobox1.setItems(FXCollections.observableArrayList(title));
combobox1.setValue("Item 0");
combobox1.setPromptText("Editable");
combobox1.setVisibleRowCount(5);
combobox1.setEditable(true);
// Cell Factory
combobox1.setCellFactory(
new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> param) {
return new ListCell<String>()
{
{
super.setPrefWidth(60);
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item);
if (item.contains("Item 0"))
setTextFill(Color.RED);
else if (item.contains("Item 1"))
setTextFill(Color.GREEN);
else if (item.contains("Item 2"))
setTextFill(Color.BLUE);
else if (item.contains("Item 3"))
setTextFill(Color.AQUA);
else if (item.contains("Item 4"))
setTextFill(Color.BLUEVIOLET);
else if (item.contains("Item 5"))
setTextFill(Color.CHOCOLATE);
else if (item.contains("Item 6"))
setTextFill(Color.DIMGRAY);
else if (item.contains("Item 7"))
setTextFill(Color.FORESTGREEN);
else if (item.contains("Item 8"))
setTextFill(Color.GREENYELLOW);
else if (item.contains("Item 9"))
setTextFill(Color.INDIGO);
}
else {
setText(null);
}
}
};
}
});
...
【執行結果】 第二個複合方塊則設定為顏色之選項項目,以setCellFactory()方法設定其Cell Factory,並在Cell Factory中以Rectangle類別設定各選項項目的顏色:
final ComboBox<Color> combobox2 = new ComboBox<>();;
combobox2.getItems().addAll(
Color.RED, Color.GREEN, Color.BLUE, Color.AQUA,
Color.BLUEVIOLET, Color.CHOCOLATE, Color.DIMGRAY,
Color.FORESTGREEN, Color.GREENYELLOW, Color.INDIGO);
// select the last element
combobox2.getSelectionModel().select(3);
combobox2.setVisibleRowCount(5);
combobox2.setEditable(false);
// Cell Factory
combobox2.setCellFactory(
new Callback<ListView<Color>, ListCell<Color>>() {
@Override
public ListCell<Color> call(ListView<Color> param) {
return new ListCell<Color>()
{
{
super.setPrefWidth(60);
}
private final Rectangle rectangle;
{
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
rectangle = new Rectangle(70, 15);
}
@Override
protected void updateItem(Color item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
}
else {
rectangle.setFill(item);
setGraphic(rectangle);
}
}
};
}
});
...
【執行結果】 以List View為例,Cell Factory將每一個選項項目視為單元,稱為清單單元 (List Cell),藉由設定Cell Factory將每一個選項項目變更為其他物件如文字字串、文字欄位或複合方塊等物件,以改變每一個選項項目的形式。
以下範例分別示範以文字欄位與複合方塊修改List View的選項項目,當點選檢視清單的選項項目時,其清單單元分別轉換為文字欄位與複合方塊,因此選項項目可藉由文字欄位輸入資料或以複合方塊選擇選項項目。以下示範設定單選模式與設定文字欄位為檢視清單的Cell Factory:
ObservableList<String> data = FXCollections.observableArrayList( "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); // ListView with TextFieldListCell final ListView<String> listview1 = new ListView<>(); // 設定單選模式 listview1.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); listview1.setItems(data); listview1.setPrefWidth(150); listview1.setPrefHeight(100); listview1.setOrientation(Orientation.VERTICAL); listview1.setEditable(true); listview1.setCellFactory(TextFieldListCell.forListView()); ... ObservableList<String> data = FXCollections.observableArrayList( "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); // ListView with ComboBoxListCell final ListView<String> listview2 = new ListView<>(); // 設定複選模式 Listview2.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); listview2.setItems(data); listview2.setPrefWidth(150); listview2.setPrefHeight(100); listview2.setOrientation(Orientation.VERTICAL); listview2.setEditable(true); listview2.setCellFactory(ComboBoxListCell.forListView(data)); ...【執行結果】
【參考資料】
[1] Java Official Web Site:http://www.oracle.com/technetwork/java/index.html
[2] JavaFX:http://www.oracle.com/technetwork/java/javafx
[3] JavaFX 8.0 API Specification.
[4] Java Platform, Standard Edition 8 API Specification.
© Chia-Hui Huang




沒有留言:
張貼留言