我用JavaFX / Scenebuilder构建了一个GUI,该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()返回一个通用对象,不能保证将其强制转换为ComboBox吗?该问题的解决办法是什么?
答案 0 :(得分:1)
如果您确定会从event.getSource()获得任何结果;将是一个ComboBox,那么您可以在该行的上方使用@SuppressWarnings("unchecked")
:
@SuppressWarnings("unchecked")
ComboBox<String> comboBox = (ComboBox<String>) event.getSource();
所以它不会再打扰了,只会影响那条线。
答案 1 :(得分:1)
注意: 这并不直接回答发布的问题,而是旨在提供另一种方法来实现OP的明显总体目标。
尽管您当然可以抑制警告,如另一个答案所示,但我想知道您是否最好在Listener
上实现ComboBox
。
您可以轻松地添加一个Listener
,只要从ComboBox
中选择一个新值,该代码便会执行代码:
comboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
label.setText(newValue);
}
});
与您当前的实现相比,这有很多好处:
NulLPointerException
。 if (newValue != null)
对此进行检查。这是一个快速的示例应用程序来演示:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class DropDownListener extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// Simple interface
VBox root = new VBox(5);
root.setPadding(new Insets(10));
root.setAlignment(Pos.CENTER);
// Simple ComboBox
ComboBox<String> comboBox = new ComboBox<>();
comboBox.getItems().addAll("One", "Two", "Three", "Four", "Five");
// Label to show selection
Label label = new Label();
// Use a listener to update the Label when a new item is selected from the ComboBox
comboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null) {
label.setText(newValue);
}
});
root.getChildren().addAll(comboBox, label);
// Show the Stage
primaryStage.setWidth(300);
primaryStage.setHeight(300);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}