修复从对象到ComboBox <string> javafx的未经检查的强制转换

时间:2019-05-12 23:48:03

标签: java string object javafx combobox

我用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吗?该问题的解决办法是什么?

2 个答案:

答案 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);
    }
});

与您当前的实现相比,这有很多好处:

  • 您无需担心强制转换或检查事件源。
  • 如果未选择任何值,则当前的实现将抛出NulLPointerExceptionif (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();
    }
}