JavaFX 组合框
JavaFX教程 - JavaFX组合框
组合框允许用户选择几个选项之一。用户可以滚动到下拉列表。组合框可以是可编辑和不可编辑的。
创建组合框
以下代码将选项列表包装到ObservableList中,然后使用observable列表实例化ComboBox类。
ObservableList<String> options = FXCollections.observableArrayList( "1", "2", "3" ); ComboBox comboBox = new ComboBox(options);
我们还可以使用空构造函数创建一个组合框,并调用其setItems方法设置数据。
ComboBox comboBox = new ComboBox(options); comboBox.setItems(options);
向具有新值的项目的组合框中添加更多项目。
comboBox.getItems().addAll( "4", "5", "6" );
setValue
方法设置在组合框中选择的项目。在调用setValue方法时,即使值不在组合框项目列表中,selectionModel属性的选定项也会更改为此值。
getValue方法返回所选的值。
要限制下拉列表中可见行的数量,请使用以下代码。
comboBox.setVisibleRowCount(3)
可编辑的组合框
setEditable(true)
方法使组合框可编辑。使用setPromptText方法,当不执行选择时,我们可以指定显示在组合框编辑区域中的文本。
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");
以下代码创建一个简单的可编辑组合框
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(); } }
上面的代码生成以下结果。
组合框单元格
我们可以使用单元格工厂来改变组合框的默认行为或外观。
以下代码创建一个单元格工厂,并将其应用到组合框。
单元格工厂生成ListCell对象。 每个单元格与一个组合框项目相关联。
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(); } }
上面的代码生成以下结果。
例2
设置和获取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(); } }
上面的代码生成以下结果。
例3
将更改监听器添加到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(); } }
上面的代码生成以下结果。
例4
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(); } }
上面的代码生成以下结果。
例5
在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(); } }
上面的代码生成以下结果。
例6
以下代码显示了如何使用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(); } }
上面的代码生成以下结果。
更多建议: