組合框允許用戶選擇幾個選項之一。用戶可以滾動到下拉列表。組合框可以是可編輯和不可編輯的。
以下代碼將選項列表包裝到ObservableList中,然后使用observable列表實例化ComboBox類。
ObservableList<String> options = FXCollections.observableArrayList( "1", "2", "3" ); ComboBox comboBox = new ComboBox(options);
我們還可以使用空構造函數(shù)創(chuàng)建一個組合框,并調(diào)用其setItems方法設置數(shù)據(jù)。
ComboBox comboBox = new ComboBox(options); comboBox.setItems(options);
向具有新值的項目的組合框中添加更多項目。
comboBox.getItems().addAll( "4", "5", "6" );
setValue
方法設置在組合框中選擇的項目。在調(diào)用setValue方法時,即使值不在組合框項目列表中,selectionModel屬性的選定項也會更改為此值。
getValue方法返回所選的值。
要限制下拉列表中可見行的數(shù)量,請使用以下代碼。
comboBox.setVisibleRowCount(3)
setEditable(true)
方法使組合框可編輯。使用setPromptText方法,當不執(zhí)行選擇時,我們可以指定顯示在組合框編輯區(qū)域中的文本。
ComboBox myComboBox = new ComboBox(); myComboBox.getItems().addAll( "s@example.com", "i@example.com", "e@example.com", "m@example.com" ); myComboBox.setPromptText("Email address"); myComboBox.setEditable(true); myComboBox.setOnAction((Event ev) -> { address = myComboBox.getSelectionModel().getSelectedItem().toString(); }); myComboBox.setValue("s@example.com");
以下代碼創(chuàng)建一個簡單的可編輯組合框
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Scene scene = new Scene(new Group(), 450, 250); ComboBox<String> myComboBox = new ComboBox<String>(); myComboBox.getItems().addAll("A","B","C","D","E"); myComboBox.setEditable(true); Group root = (Group) scene.getRoot(); root.getChildren().add(myComboBox); stage.setScene(scene); stage.show(); } }
上面的代碼生成以下結果。
我們可以使用單元格工廠來改變組合框的默認行為或外觀。
以下代碼創(chuàng)建一個單元格工廠,并將其應用到組合框。
單元格工廠生成ListCell對象。 每個單元格與一個組合框項目相關聯(lián)。
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.util.Callback; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Scene scene = new Scene(new Group(), 200, 200); ComboBox<String> myComboBox = new ComboBox<String>(); myComboBox.getItems().addAll("A", "B", "C", "D", "E"); myComboBox .setCellFactory(new Callback<ListView<String>, ListCell<String>>() { @Override public ListCell<String> call(ListView<String> param) { final ListCell<String> cell = new ListCell<String>() { { super.setPrefWidth(100); } @Override public void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (item != null) { setText(item); if (item.contains("A")) { setTextFill(Color.RED); } else if (item.contains("B")) { setTextFill(Color.GREEN); } else { setTextFill(Color.BLACK); } } else { setText(null); } } }; return cell; } }); Group root = (Group) scene.getRoot(); root.getChildren().add(myComboBox); stage.setScene(scene); stage.show(); } }
上面的代碼生成以下結果。
將值設置為null以清除ComboBox
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Scene scene = new Scene(new Group(), 450, 250); ComboBox<String> myComboBox = new ComboBox<String>(); myComboBox.getItems().addAll("A","B","C","D","E"); myComboBox.setValue("A"); System.out.println(myComboBox.getValue()); myComboBox.setValue(null); Group root = (Group) scene.getRoot(); root.getChildren().add(myComboBox); stage.setScene(scene); stage.show(); } }
上面的代碼生成以下結果。
設置和獲取ComboBox的值
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Scene scene = new Scene(new Group(), 450, 250); ComboBox<String> myComboBox = new ComboBox<String>(); myComboBox.getItems().addAll("A","B","C","D","E"); myComboBox.setValue("A"); System.out.println(myComboBox.getValue()); Group root = (Group) scene.getRoot(); root.getChildren().add(myComboBox); stage.setScene(scene); stage.show(); } }
上面的代碼生成以下結果。
將更改監(jiān)聽器添加到ComboBox valueProperty
import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Scene scene = new Scene(new Group(), 450, 250); ComboBox<String> myComboBox = new ComboBox<String>(); myComboBox.getItems().addAll("A","B","C","D","E"); myComboBox.setValue("A"); System.out.println(myComboBox.getValue()); myComboBox.valueProperty().addListener(new ChangeListener<String>() { @Override public void changed(ObservableValue ov, String t, String t1) { System.out.println(ov); System.out.println(t); System.out.println(t1); } }); Group root = (Group) scene.getRoot(); root.getChildren().add(myComboBox); stage.setScene(scene); stage.show(); } }
上面的代碼生成以下結果。
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { Scene scene = new Scene(new Group(), 450, 250); ComboBox<String> myComboBox = new ComboBox<String>(); myComboBox.getItems().addAll("A","B","C","D","E"); myComboBox.setEditable(true); myComboBox.setPromptText("Email address"); Group root = (Group) scene.getRoot(); root.getChildren().add(myComboBox); stage.setScene(scene); stage.show(); } }
上面的代碼生成以下結果。
在ComboBox中顯示矩形
import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(final Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 400, 300, Color.WHITE); GridPane gridpane = new GridPane(); ComboBox<Rectangle> cmb = new ComboBox<Rectangle>(); cmb.getItems().addAll( new Rectangle(10, 10, Color.RED), new Rectangle(10, 10, Color.GREEN), new Rectangle(10, 10, Color.BLUE)); gridpane.add(cmb, 2, 0); root.getChildren().add(gridpane); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代碼生成以下結果。
以下代碼顯示了如何使用CellFactory顯示組合框值。
//Revised from javafx api document import javafx.application.Application; import javafx.scene.Group; 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.GridPane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; import javafx.util.Callback; public class Main extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(final Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 400, 300, Color.WHITE); GridPane gridpane = new GridPane(); ComboBox<Color> cmb = new ComboBox<Color>(); cmb.getItems().addAll(Color.RED, Color.GREEN, Color.BLUE); cmb.setCellFactory(new Callback<ListView<Color>, ListCell<Color>>() { @Override public ListCell<Color> call(ListView<Color> p) { return new ListCell<Color>() { private final Rectangle rectangle; { setContentDisplay(ContentDisplay.GRAPHIC_ONLY); rectangle = new Rectangle(10, 10); } @Override protected void updateItem(Color item, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { setGraphic(null); } else { rectangle.setFill(item); setGraphic(rectangle); } } }; } }); gridpane.add(cmb, 2, 0); root.getChildren().add(gridpane); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代碼生成以下結果。
更多建議: