單選按鈕通常組合在一起以允許用戶進行單選,即用戶只能在單選按鈕列表中選擇一個項目。例如,當選擇鞋子尺寸時,我們通常從列表中選擇一個尺寸。
選擇或取消選擇單選按鈕。
以下代碼顯示,當放置在ToggleGroup中時,只能選擇一個RadioButton。
import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.RadioButton; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.HBox; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage stage) { HBox root = new HBox(); Scene scene = new Scene(root, 300, 150); stage.setScene(scene); stage.setTitle(""); ToggleGroup group = new ToggleGroup(); RadioButton button1 = new RadioButton("select first"); button1.setToggleGroup(group); button1.setSelected(true); RadioButton button2 = new RadioButton("select second"); button2.setToggleGroup(group); root.getChildren().add(button1); root.getChildren().add(button2); scene.setRoot(root); stage.show(); } public static void main(String[] args) { launch(args); } }
上面的代碼生成以下結果。
javafx.scene.control包中的RadioButton類有兩個構造函數(shù)。
要為其標簽創(chuàng)建一個帶有空字符串的單選按鈕,然后再設置標簽。
RadioButton rb = new RadioButton(); //setting a text label rb.setText("Size 9");
要創(chuàng)建具有指定標簽的單選按鈕
RadioButton rb2 = new RadioButton("Size 9");
帶有true參數(shù)的setSelected()方法可以顯式選擇單選按鈕。
isSelected
方法返回用戶是否選擇了特定單選按鈕。
setGraphic
方法可以為RadioButton安裝一個圖像。
Image image = new Image(getClass().getResourceAsStream("Size.jpg")); RadioButton rb = new RadioButton("Size 9"); rb.setGraphic(new ImageView(image));
單選按鈕通常用在組中。
我們可以添加單選按鈕到ToggleGroup
對象,它將管理它們,使得一次只能選擇一個單選按鈕。
下面的代碼創(chuàng)建一個切換組和三個單選按鈕,然后將每個單選按鈕添加到切換組,并指定應該選擇哪個按鈕。
ToggleGroup group = new ToggleGroup(); RadioButton rb1 = new RadioButton("Size 9"); rb1.setToggleGroup(group); rb1.setSelected(true); RadioButton rb2 = new RadioButton("Size 10"); rb2.setToggleGroup(group); RadioButton rb3 = new RadioButton("Size 11"); rb3.setToggleGroup(group);
我們通過ToggleGroup處理單選按鈕選擇的事件。更改偵聽器添加到ToggleGroup。
為每個單選按鈕分配了用戶數(shù)據(jù)。
ChangeListener對象檢查組中的選定項目。所選單選按鈕從getSelectedToggle方法返回。然后我們通過調用getUserData方法獲取用戶數(shù)據(jù)。
rb1.setUserData("Home") rb2.setUserData("Calendar"); rb3.setUserData("Contacts"); final ToggleGroup group = new ToggleGroup(); group.selectedToggleProperty().addListener( (ObservableValue<? extends Toggle> ov, Toggle old_toggle, Toggle new_toggle) -> { if (group.getSelectedToggle() != null) { System.out.println(group.getSelectedToggle().getUserData().toString()); } } });
完整的源代碼。
import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.geometry.Insets; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.RadioButton; import javafx.scene.control.Toggle; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; 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()); stage.setWidth(250); stage.setHeight(150); final ToggleGroup group = new ToggleGroup(); RadioButton rb1 = new RadioButton("A"); rb1.setToggleGroup(group); rb1.setUserData("A"); RadioButton rb2 = new RadioButton("B"); rb2.setToggleGroup(group); rb2.setUserData("B"); RadioButton rb3 = new RadioButton("C"); rb3.setToggleGroup(group); rb3.setUserData("C"); group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() { public void changed(ObservableValue<? extends Toggle> ov, Toggle old_toggle, Toggle new_toggle) { if (group.getSelectedToggle() != null) { System.out.println(group.getSelectedToggle().getUserData().toString()); } } }); HBox hbox = new HBox(); VBox vbox = new VBox(); vbox.getChildren().add(rb1); vbox.getChildren().add(rb2); vbox.getChildren().add(rb3); vbox.setSpacing(10); hbox.getChildren().add(vbox); hbox.setSpacing(50); hbox.setPadding(new Insets(20, 10, 10, 20)); ((Group) scene.getRoot()).getChildren().add(hbox); stage.setScene(scene); stage.show(); } }
上面的代碼生成以下結果。
在單選按鈕組中,默認情況下第一個按鈕最初具有焦點。
當使用setSelected
方法選擇單選按鈕時,我們還應該使用requestFocus函數(shù)將焦點更改為所選單選按鈕。
rb.setSelected(true); rb.requestFocus();
更多建議: