猿问

修复从Object到ComboBox的未经检查的强制转换<String> javafx

我用JavaFX / Scenebuilder构建了一个GUI,它有多个具有类似功能的下拉列表。我想对所有下拉列表使用相同的函数,所以我必须检查动作事件的来源。我目前的代码是:


public void dropdownPressed(ActionEvent event) {

    ComboBox<String> comboBox = (ComboBox<String>) event.getSource();

    Label.setText(comboBox.getSelectionModel().getSelectedItem());

}

它有效,但它发出以下警告:


Type safety: Unchecked cast from Object to ComboBox<String>

所以根据我的理解,getSource()返回一个通用的Object,不能保证可以转换为ComboBox?这个问题的解决方案是什么?


蛊毒传说
浏览 690回答 1
1回答

慕容3067478

虽然你当然可以抑制警告作为另一个答案表明,我不知道你可能会更好实现Listener你的ComboBox来代替。Listener每当从以下位置选择新值时,您都可以轻松添加将执行代码的代码ComboBox:comboBox.getSelectionModel().selectedItemProperty().addListener((observable,&nbsp;oldValue,&nbsp;newValue)&nbsp;->&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(newValue&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setText(newValue); &nbsp;&nbsp;&nbsp;&nbsp;}});这比您当前的实现有几个好处:您无需担心转换或检查事件源。NulLPointerException如果没有选择任何值,您当前的实现将抛出。在if (newValue != null)该检查。您不需要编写单独的方法来处理选择更改。这是一个快速示例应用程序来演示:import&nbsp;javafx.application.Application;import&nbsp;javafx.geometry.Insets;import&nbsp;javafx.geometry.Pos;import&nbsp;javafx.scene.Scene;import&nbsp;javafx. scene.control.ComboBox;import&nbsp;javafx.scene.control.Label;import&nbsp;javafx.scene.layout.VBox;import&nbsp;javafx.stage.Stage; public&nbsp;class&nbsp;DropDownListener&nbsp;extends&nbsp;Application&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;launch(args); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;start(Stage&nbsp;primaryStage)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Simple&nbsp;interface &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VBox&nbsp;root&nbsp;=&nbsp;new&nbsp;VBox(5); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.setPadding(new&nbsp;Insets(10)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.setAlignment(Pos.CENTER); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Simple&nbsp;ComboBox &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComboBox<String>&nbsp;comboBox&nbsp;=&nbsp;new&nbsp;ComboBox<>(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comboBox.getItems().addAll("One",&nbsp;"Two",&nbsp;"Three",&nbsp;"Four",&nbsp;"Five"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Label&nbsp;to&nbsp;show&nbsp;selection &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Label&nbsp;label&nbsp;=&nbsp;new&nbsp;Label(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Use&nbsp;a&nbsp;listener&nbsp;to&nbsp;update&nbsp;the&nbsp;Label&nbsp;when&nbsp;a&nbsp;new&nbsp;item&nbsp;is&nbsp;selected&nbsp;from&nbsp;the&nbsp;ComboBox &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comboBox.getSelectionModel().selectedItemProperty().addListener((observable,&nbsp;oldValue,&nbsp;newValue)&nbsp;->&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(newValue&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label.setText(newValue); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.getChildren().addAll(comboBox,&nbsp;label); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Show&nbsp;the&nbsp;Stage &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primaryStage.setWidth(300); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primaryStage.setHeight(300); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primaryStage.setScene(new&nbsp;Scene(root)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primaryStage.show(); &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP

相关分类

Java
我要回答