当前位置: 首页 > 知识库问答 >
问题:

JavaFX应用程序中的ClassCasting错误和tableView上显示值的问题

关项明
2023-03-14

一切正常,但后来我添加了泛型,现在这个ClassCastException不断弹出,我不知道为什么。

****重要****
所以我也试着删除它,但这里出现了另一个问题。所有的值都打印出来直到牵引力控制柱。在此之后,所有的值都不显示事件,尽管除了其中一些值的数据类型之外,所有的值都是完全相同的。

public class MainGUI extends Application {

private static Stage stage;

@Override
public void start(Stage primaryStage) throws Exception {

    stage = primaryStage;
    Platform.setImplicitExit(false);

    stage.setTitle("Westminster Rentals");
    VBox mainLayout = new VBox();

    Scene scene = new Scene(mainLayout, 1655,800);

    Label heading1 = new Label("Welcome to Westminster Rentals");
    heading1.setStyle("-fx-font-size: 32px; -fx-font-family: -apple-system, sans-serif;");
    heading1.setPadding(new Insets(20,20,20,20));


    //_____________________Search Tab__________________________________//

    // search Tab will hold search bar, search button and rent button

    HBox searchTab = new HBox();
    searchTab.setStyle("-fx-spacing: 10px; -fx-padding: 20px");

    JFXButton searchButton = new JFXButton("Search");
    searchButton.setAlignment(Pos.CENTER);
    searchButton.setStyle("-fx-padding: 20px;-fx-background-color: #6143d5; -fx-text-fill: #fff;");

    JFXTextField searchBar = new JFXTextField();
    searchBar.setPrefWidth(500);
    searchBar.setStyle("-fx-padding: 20px;");
    searchBar.promptTextProperty().setValue("Search....");

    HBox rentTab = new HBox();
    JFXButton rent = new JFXButton("Rent a car");
    rent.setOnAction(e->{
        RentGUI.showRentPage();
    });
    rent.setStyle("-fx-padding: 20px;-fx-background-color: #1ad541; -fx-text-fill: #fff;");


    rentTab.getChildren().add(rent);
    searchTab.getChildren().addAll(searchBar,searchButton, rentTab);

    //_____________________Search Tab --END--_____________________________//


    //Main Heading will hold a vertical alignment for heading1 and the searchTab Hbox to create embedded layout
    VBox mainHeading =  new VBox();
    mainHeading.getChildren().addAll(heading1,searchTab);

    //Table view and Table columns are used to build the table attribute of the app
    // This needs to be done as below unless FXML is used to build the application
    TableView<Vehicle> tableView = new TableView<>();
    tableView.setEditable(false);

    TableColumn<Vehicle, String> makeColumn = new TableColumn<>("Make");
    makeColumn.setPrefWidth(150);
    makeColumn.setCellValueFactory(data->  new SimpleStringProperty(data.getValue().getMake()));

    TableColumn<Vehicle,String> modelColumn = new TableColumn<>("Model");
    modelColumn.setPrefWidth(200);
    modelColumn.setCellValueFactory(new PropertyValueFactory<>("model"));

    TableColumn<Vehicle,String> plateNumColumn = new TableColumn<>("Plate Number");
    plateNumColumn.setPrefWidth(200);
    plateNumColumn.setCellValueFactory(new PropertyValueFactory<>("plateNumber"));

    TableColumn<Vehicle,String> fuelTypeColumn = new TableColumn<>("Fuel Type");
    fuelTypeColumn.setPrefWidth(200);
    fuelTypeColumn.setCellValueFactory(new PropertyValueFactory<>("fuelType"));

    TableColumn<Vehicle, BigDecimal> priceColumn = new TableColumn<>("Price Per Hour (USD)");
    priceColumn.setPrefWidth(200);
    priceColumn.setCellValueFactory(new PropertyValueFactory<>("pricePerHour"));

    TableColumn<Vehicle,String> transmissionColumn = new TableColumn<>("Transmission");
    transmissionColumn.setPrefWidth(200);
    transmissionColumn.setCellValueFactory(new PropertyValueFactory<>("transmission"));

    TableColumn carColumn = new TableColumn("Car");
    carColumn.setPrefWidth(200);
    carColumn.setCellValueFactory(new PropertyValueFactory("car"));

    TableColumn<Car,Boolean> tractionControlColumn = new TableColumn<>("Traction Control?");
    tractionControlColumn.setPrefWidth(200);
    tractionControlColumn.setCellValueFactory(new PropertyValueFactory<>("tractionControl"));

    TableColumn<Car,Boolean> appleCarPlayColumn = new TableColumn<>("Apple Car Play?");
    appleCarPlayColumn.setPrefWidth(200);
    appleCarPlayColumn.setCellValueFactory(data-> new SimpleBooleanProperty(data.getValue().hasAppleCarPlay()));

    TableColumn <Car,String>parkingAssistanceColumn = new TableColumn<>("Parking Assistance?");
    parkingAssistanceColumn.setPrefWidth(200);
    parkingAssistanceColumn.setCellValueFactory(data-> new SimpleStringProperty(String.valueOf(data.getValue().hasParkingAssistant())));

    TableColumn<Car,String> blindSpotAwarenessColumn = new TableColumn<>("Blind spot awareness?");
    blindSpotAwarenessColumn.setPrefWidth(200);
    blindSpotAwarenessColumn.setCellValueFactory(data-> new SimpleStringProperty(String.valueOf(data.getValue().hasBlindSpotAwareness())));

    TableColumn bikeColumn = new TableColumn("Motorbikes");
    bikeColumn.setPrefWidth(200);
    bikeColumn.setCellValueFactory(new PropertyValueFactory("motorbike"));

    TableColumn<Motorbike, Boolean> basketColumn = new TableColumn<>("Basket?");
    basketColumn.setPrefWidth(200);
    basketColumn.setCellValueFactory(data-> new SimpleBooleanProperty(data.getValue().hasBasket()));

    TableColumn<Motorbike, Boolean> gyroColumn = new TableColumn<>("Gyroscopic Balance?");
    gyroColumn.setPrefWidth(200);
    gyroColumn.setCellValueFactory(data-> new SimpleBooleanProperty(data.getValue().hasGyroscopicBalance()));


    carColumn.getColumns().addAll(tractionControlColumn,appleCarPlayColumn,parkingAssistanceColumn,blindSpotAwarenessColumn);
    bikeColumn.getColumns().addAll(basketColumn,gyroColumn);
    tableView.getColumns().addAll(makeColumn,modelColumn,plateNumColumn,fuelTypeColumn,priceColumn,transmissionColumn,carColumn,bikeColumn);

    mainLayout.getChildren().addAll(mainHeading, tableView);
    tableView.setItems(addTableItems());

    stage.setScene(scene);
    stage.show();

}


//addTableItems will create an observable list required to enter values into the table.

private ObservableList<Vehicle> addTableItems() throws UnknownHostException {
    ObservableList<Vehicle> musicItem = FXCollections.observableArrayList();
    for (Vehicle item: Database.getDatastore().find(Vehicle.class).asList()){
        musicItem.addAll(item);
    }
    return musicItem;
}

public static void main(){
    launch();
}

public static void showStage(){
    stage.show();
}
}
public class Main extends Thread{

private static Scanner scanner = new Scanner(System.in);
private static Stage stage;

public static void main(String[] args) {
    int userResponse;
    RentalVehicleManager rentalVehicleManager = new WestminsterRentalVehicleManager();
    Thread guiControlThread = new Thread(MainGUI::main);
    guiControlThread.start();
}

}

假设我删除lambdas并放入新的PropertyValueFactory。然后错误消失,GUI工作

牵引力控制后的值不显示

共有1个答案

李新霁
2023-03-14

TableView(Vehicle)的类型参数与用于某些列的第一个类型参数之间存在差异。这两个类型参数应该是匹配的。否则这样的事情就会发生。

由于vehicletableview的类型参数,编译器允许您将可分配给vehicle的所有内容添加到该tableviewitems列表中。

basketcolumn声明为tablecolumn basketcolumn “告诉”编译器表中的所有项都是motorbike的。由于这个原因,下面的代码段将在编译后的代码中产生相同的结果:

TableColumn basketColumn = new TableColumn("Basket?"); // note the use of the raw type here
basketColumn.setPrefWidth(200);

// note the hidden cast inserted here by the compiler based on the type parameter in the declaration
// this is the cause of the ClassCastException
basketColumn.setCellValueFactory(data -> new SimpleBooleanProperty(((Motorbike) data.getValue()).hasBasket()));

由于要将cars和motorbikes都放入TableView中,因此需要返回一个基于CellValueFactorys中的真实类型的结果:

TableColumn<Vehicle, Boolean> basketColumn = new TableColumn<>("Basket?");
basketColumn.setPrefWidth(200);
basketColumn.setCellValueFactory(data -> {
    Vehicle item = data.getValue();
    if (item instanceof Motorbike) {
        return new SimpleBooleanProperty(((Motorbike) item).hasBasket());
    } else {
        return null; // put something else here, if you don't want empty cells for non Motorbikes
    }
});

在您的代码中还有其他多个地方需要进行这样的更改。

 类似资料:
  • 我正在尝试从一个数据集创建一个TableView,该数据集由一个具有字符串值的双嵌套ArrayList组成。遗憾的是,我无法在TableView中显示所有值。行没有根据数据集进行编号。 internet的大多数解决方案都表明,我应该使用特定的对象实例。然而,我不是这样工作的。相反,我使用大小不确定的字符串矩阵。数据结构如下: 我最好的(但错误的)结果是通过以下代码实现的: 结果如下: 但是,该表不

  • 我正在开发一个小型的玩具应用程序,以扩展我关于和的知识。我在本地网络中有一个MySQL服务器,我可以与之通信,一个简单的Tableview可以被填充、排序...等等。数据只显示给用户,没有编辑。一切都很干净。 问题是: > 大约有17万行10列,全部,要显示,这似乎很难在合理的时间内完成。查询是在启动时完成的,大约需要1.5分钟才能看到表。 而且内存占用非常大,没有填充Tableview的应用程序

  • 我是JavaFX新手。我正在使用TableView并尝试将用户从字段Username和Password输入的数据放入表中。只是个测试程序。我得到下面的错误。

  • 我正在尝试使用rails创建新项目,但它显示错误。我正在处理mac及其显示错误 $rails新特快专递

  • 控制器代码 我想在表格视图中显示之前对数据做一些操作 像秋千 在摇摆,我喜欢这个,它工作得很好。 但不知道如何在tableview javafx上进行操作。

  • 我正在尝试运行Spring Boot REST API应用程序,但遇到了404错误。 波姆。xml 我还尝试了,但没有成功。你能帮我解决这个问题吗? 如果我打http://localhost:8080/hello网址,然后我得到404。