从服务器; 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();
}
}
我正在尝试使用 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();
}
}