从服务器; SQL, 数组列表 |致客户;表视图

From Server; SQL, arrayList | To Client; TableView

我正在尝试使用 JavaFX tableView 查看 SQL 数据库 table。

我在服务器上有一个 DBHandler class,它有一个方法 "select" 来自 table 的所有项目,然后我将这些值存储在 resultSet 中。然后,我使用 while 循环将 resultSet 的内容添加到对象 class Room 的数组列表中。然后通过套接字将 arrayList 发送到客户端。

客户端读取对象作为Room的实例class,对象被添加到另一个arrayList,被添加到一个observableList,用于添加数据到Table 看法。

但是,code/logic 不起作用。在客户端,我收到 'java.lang.ClassCastException: java.util.ArrayList cannot be cast to Room' 错误。

客户端:FXMLController::

public class FXMLControl implements Initializable {
    @FXML private TableView tblRooms;
    @FXML private TableColumn roomNo;
    @FXML private TableColumn capacity;
    @FXML private TableColumn type;

    @FXML private void onViewRooms(ActionEvent event) throws IOException {
        MainApp main = new MainApp();
        main.viewRooms();
        tblRooms.setEditable(true);
        ObservableList<Room> listo = FXCollections.observableArrayList(main.rooms);
        tblRooms.setItems(listo);
}}

客户端:MainApp::

public class MainApp extends Application {
   ArrayList<Room> rooms = new ArrayList<Room>();

   public void viewRooms() throws IOException, ClassNotFoundException{
      String sendServer = "viewRooms");
      oos.writeObject(sendServer);
      oos.flush();

      Room roomer = (Room) ois.readObject();
      rooms.add(roomer);
}}

服务器:

public class server {

   public static void clientSession() throws IOException, ClassNotFoundException, SQLException{
      String userInput = ois.readObject();

      switch(userInput){
         case "viewRooms":
         DBHandler dbhandler = new DBHandler(username,password,url);
         dbhandler.viewRooms();

         oos.writeObject(databaseManager.rooms);
         oos.flush();}
}}

服务器:DBHandler::

public class DBHandler {
   ArrayList<Room> rooms = new ArrayList<Room>();

   void viewRooms() throws SQLException {
   //db connection setup
      String query = "SELECT * FROM ROOM";
      PreparedStatement preparedStatement = conn.prepareStatement(query);
      ResultSet rs = preparedStatement.executeQuery();
      while(rs.next()){
         rooms.add(new Room(rec.getInt("ROOMNO"),rec.getInt("CAPACITY"),rec.getString("TYPE")));
         }
      }}

房间 class:

public class Room implements Serializanle {
   private int roomNo;
   private int capacity;
   private String type;
// contructors ...
// getter and setter methods
}

用户应该可以按下按钮 (onViewRooms),服务器将 'alerted' 发回数据库中的内容。 任何帮助将不胜感激!

您的服务器向流发送单个列表:

oos.writeObject(databaseManager.rooms);

但是当您收到列表时,您尝试将其转换为 Room:

Room roomer = (Room) ois.readObject();

因为 ArrayList 不是 Room,这显然失败并出现 class 转换异常。

直接转换为列表:

public class MainApp extends Application {
   List<Room> rooms ;

   public void viewRooms() throws IOException, ClassNotFoundException{
      String sendServer = "viewRooms");
      oos.writeObject(sendServer);
      oos.flush();

      rooms = (List<Room>) ois.readObject();
   }  
}