Java 同一列中不同类型的对象
我有一个表格,显示了几次旅行的信息。其中一列是driver,它告诉谁被指定为某一行程的驾驶员。我想要实现的是,若并没有分配驱动程序(数据库中为null),那个么您应该能够单击特定单元格中的按钮并选择驱动程序 事实证明,这比我最初想象的更具挑战性。这就是想法: 我发现了下面的问题,但我不确定如何在我的系统中实现该解决方案。 我应该调查什么?是否有记录在案的方法来实现这一点 代码如下:Java 同一列中不同类型的对象,java,javafx,Java,Javafx,我有一个表格,显示了几次旅行的信息。其中一列是driver,它告诉谁被指定为某一行程的驾驶员。我想要实现的是,若并没有分配驱动程序(数据库中为null),那个么您应该能够单击特定单元格中的按钮并选择驱动程序 事实证明,这比我最初想象的更具挑战性。这就是想法: 我发现了下面的问题,但我不确定如何在我的系统中实现该解决方案。 我应该调查什么?是否有记录在案的方法来实现这一点 代码如下: public class BookViewController { private String d
public class BookViewController {
private String dbUrl = "jdbc:postgresql://localhost:5432/BookingApp";
private String dbUsername = "postgres";
private String dbPassword = "secret";
@FXML
private TextField personnr;
@FXML
private TextField name;
@FXML
private TextField email;
@FXML
private TextField telnr;
@FXML
private Button addTraveler;
@FXML
private Button removeTraveler;
@FXML
private TableView<Traveler> travelers;
@FXML
private TableColumn<?, ?> personnrColumn;
@FXML
private TableColumn<?, ?> nameColumn;
@FXML
private TableColumn<?, ?> emailColumn;
@FXML
private TableColumn<?, ?> telnrColumn;
@FXML
private TableView<Trip> trips;
@FXML
private TableColumn<?, ?> originColumn;
@FXML
private TableColumn<?, ?> destinationColumn;
@FXML
private TableColumn<?, ?> departureColumn;
@FXML
private TableColumn<?, ?> arrivalColumn;
@FXML
private TableColumn<?, ?> driverColumn;
@FXML
private TableColumn<?, ?> priceAmountColumn;
@FXML
private TableColumn<?, ?> seatsColumn;
@FXML
private Button bookTrip;
private Trip rowData;
private ObservableList<Trip> tripData;
protected void initialize(Trip rowData) {
this.rowData = rowData;
addTraveler.setDisable(true);
removeTraveler.setDisable(true);
populateTravelPlan();
}
@FXML
private void populateTravelPlan() {
originColumn.setCellValueFactory(new PropertyValueFactory<>("origin"));
destinationColumn.setCellValueFactory(new PropertyValueFactory<>("destination"));
departureColumn.setCellValueFactory(new PropertyValueFactory<>("departure"));
arrivalColumn.setCellValueFactory(new PropertyValueFactory<>("arrival"));
driverColumn.setCellValueFactory(new PropertyValueFactory<>("driver"));
priceAmountColumn.setCellValueFactory(new PropertyValueFactory<>("priceAmount"));
seatsColumn.setCellValueFactory(new PropertyValueFactory<>("seats"));
try {
Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
tripData = FXCollections.observableArrayList();
ResultSet rs = null;
if(rowData.getTrip1() != 0 && rowData.getTrip2() == 0 && rowData.getTrip3() == 0) {
rs = conn.createStatement().executeQuery(
"select trip.tripid, connexion.origin, connexion.destination, trip.departure, trip.arrival, trip.driverpnr, trip.priceamount, trip.seats\r\n" +
"from trip, connexion\r\n" +
"where trip.tripid = " + rowData.getTrip1() + "\r\n" +
"and trip.connexionid = connexion.connexionid\r\n" +
"order by departure;");
} else if(rowData.getTrip1() != 0 && rowData.getTrip2() != 0 && rowData.getTrip3() == 0) {
rs = conn.createStatement().executeQuery(
"select trip.tripid, connexion.origin, connexion.destination, trip.departure, trip.arrival, trip.driverpnr, trip.priceamount, trip.seats\r\n" +
"from trip, connexion\r\n" +
"where trip.tripid = " + rowData.getTrip1() + "\r\n" +
"and trip.connexionid = connexion.connexionid\r\n" +
"union\r\n" +
"select trip.tripid, connexion.origin, connexion.destination, trip.departure, trip.arrival, trip.driverpnr, trip.priceamount, trip.seats\r\n" +
"from trip, connexion\r\n" +
"where trip.tripid = " + rowData.getTrip2() + "\r\n" +
"and trip.connexionid = connexion.connexionid\r\n" +
"order by departure;");
} else if(rowData.getTrip1() != 0 && rowData.getTrip2() != 0 && rowData.getTrip3() != 0) {
rs = conn.createStatement().executeQuery(
"select trip.tripid, connexion.origin, connexion.destination, trip.departure, trip.arrival, trip.driverpnr, trip.priceamount, trip.seats\r\n" +
"from trip, connexion\r\n" +
"where trip.tripid = " + rowData.getTrip1() + "\r\n" +
"and trip.connexionid = connexion.connexionid\r\n" +
"union\r\n" +
"select trip.tripid, connexion.origin, connexion.destination, trip.departure, trip.arrival, trip.driverpnr, trip.priceamount, trip.seats\r\n" +
"from trip, connexion\r\n" +
"where trip.tripid = " + rowData.getTrip2() + "\r\n" +
"and trip.connexionid = connexion.connexionid\r\n" +
"union\r\n" +
"select trip.tripid, connexion.origin, connexion.destination, trip.departure, trip.arrival, trip.driverpnr, trip.priceamount, trip.seats\r\n" +
"from trip, connexion\r\n" +
"where trip.tripid = " + rowData.getTrip3() + "\r\n" +
"and trip.connexionid = connexion.connexionid\r\n" +
"order by departure;");
}
if(rs.next()) {
tripData.add(new Trip(rs.getInt(1), rs.getString(2), rs.getString(3), ""+rs.getTimestamp(4), ""+rs.getTimestamp(5), rs.getString(6), ""+rs.getInt(7), ""+rs.getInt(8)));
while(rs.next()) {
tripData.add(new Trip(rs.getInt(1), rs.getString(2), rs.getString(3), ""+rs.getTimestamp(4), ""+rs.getTimestamp(5), rs.getString(6), ""+rs.getInt(7), ""+rs.getInt(8)));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
trips.setItems(tripData);
}
}
公共类BookViewController{
私有字符串dbUrl=“jdbc:postgresql://localhost:5432/BookingApp";
私有字符串dbUsername=“postgres”;
私有字符串dbPassword=“secret”;
@FXML
私人文本字段人员;
@FXML
私有文本字段名;
@FXML
私人文本域电子邮件;
@FXML
私人TextField电话号码;
@FXML
私人按钮;
@FXML
专用按钮拆卸器;
@FXML
私人桌游旅行者;
@FXML
私有表列personnr列;
@FXML
私有表列名称列;
@FXML
私有表列和电子邮件列;
@FXML
私有表列telnr列;
@FXML
私人桌游;
@FXML
private TableColumn originColumn;
@FXML
私有表列destinationColumn;
@FXML
私有表列departureColumn;
@FXML
私有表列arrivalColumn;
@FXML
私有表列驱动器列;
@FXML
private TableColumn priceAmountColumn;
@FXML
私人桌柱座柱;
@FXML
私人按钮预订行程;
私人旅行数据;
私有可观测数据;
受保护的无效初始化(跳闸行数据){
this.rowData=rowData;
addTraveler.setDisable(true);
removeTraveler.setDisable(true);
普及计划();
}
@FXML
私有void平面图(){
originColumn.setCellValueFactory(新属性ValueFactory(“原点”);
destinationColumn.setCellValueFactory(新属性ValueFactory(“目标”);
departureColumn.setCellValueFactory(新属性ValueFactory(“离开”));
arrivalColumn.setCellValueFactory(新属性ValueFactory(“arrival”);
driverColumn.setCellValueFactory(新属性ValueFactory(“驱动程序”));
priceAmountColumn.setCellValueFactory(新的PropertyValueFactory(“priceAmount”);
SeatColumn.setCellValueFactory(新属性ValueFactory(“座椅”);
试一试{
Connection conn=DriverManager.getConnection(dbUrl、dbUsername、dbPassword);
tripData=FXCollections.observableArrayList();
结果集rs=null;
if(rowData.getTrip1()!=0&&rowData.getTrip2()==0&&rowData.getTrip3()==0){
rs=conn.createStatement().executeQuery(
“选择trip.tripid、connexion.origin、connexion.destination、trip.deposition、trip.arrival、trip.driverpnr、trip.priceamount、trip.seats\r\n”+
“从跳闸,连接\r\n”+
“where trip.tripid=“+rowData.getTrip1()+”\r\n”+
“and trip.connexionid=connexion.connexionid\r\n”+
“离境命令;”;
}else if(rowData.getTrip1()!=0&&rowData.getTrip2()!=0&&rowData.getTrip3()==0){
rs=conn.createStatement().executeQuery(
“选择trip.tripid、connexion.origin、connexion.destination、trip.deposition、trip.arrival、trip.driverpnr、trip.priceamount、trip.seats\r\n”+
“从跳闸,连接\r\n”+
“where trip.tripid=“+rowData.getTrip1()+”\r\n”+
“and trip.connexionid=connexion.connexionid\r\n”+
“联合\r\n”+
“选择trip.tripid、connexion.origin、connexion.destination、trip.deposition、trip.arrival、trip.driverpnr、trip.priceamount、trip.seats\r\n”+
“从跳闸,连接\r\n”+
“where trip.tripid=“+rowData.getTrip2()+”\r\n”+
“and trip.connexionid=connexion.connexionid\r\n”+
“离境命令;”;
}else if(rowData.getTrip1()!=0&&rowData.getTrip2()!=0&&rowData.getTrip3()!=0){
rs=conn.createStatement().executeQuery(
“选择trip.tripid、connexion.origin、connexion.destination、trip.deposition、trip.arrival、trip.driverpnr、trip.priceamount、trip.seats\r\n”+
“从跳闸,连接\r\n”+
“where trip.tripid=“+rowData.getTrip1()+”\r\n”+
“and trip.connexionid=connexion.connexionid\r\n”+
“联合\r\n”+
“选择trip.tripid、connexion.origin、connexion.destination、trip.deposition、trip.arrival、trip.driverpnr、trip.priceamount、trip.seats\r\n”+
“从跳闸,连接\r\n”+
“where trip.tripid=“+rowData.getTrip2()+”\r\n”+
“and trip.connexionid=connexion.connexionid\r\n”+
“联合\r\n”+
“选择trip.tripid、connexion.origin、connexion.destination、trip.deposition、trip.arrival、trip.driverpnr、trip.priceamount、trip.seats\r\n”+
“从跳闸,连接\r\n”+
“where trip.tripid=“+rowData.getTrip3()+”\r\n”+
“and trip.connexionid=connexion.connexionid\r\n”+
“离境命令;”;
}
如果(rs.next()){
添加(新行程)(rs.getInt(1)、rs.getString(2)、rs.ge
driverColumn.setCellFactory(this::createDriverCell);
private TableCell<Trip,String> createDriverCell(TableColumn<Trip, String> table) {
return new TableCell<Trip, String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
// configure empty
} else if (item == null) {
// create no driver content
} else {
// create different content
}
}
};
}
//give driverColumn proper types
TableColumn<Trip,String> driverColumn;
//...
driverColumn.setCellValueFactory(new Callback<CellDataFeatures<Trip, String>, ObservableValue<String>>() {
public ObservableValue<String> call(CellDataFeatures<Trip, String> p) {
// p.getValue() returns the Trip instance for a particular TableView row
return new SimpleStringProperty(p.getValue().getDriver());
}
});
driverColumn.setCellFactory(param -> new TableCell<Trip,String>{
public void updateItem(String driver, boolean empty) {
super.updateItem(driver, empty);
//reset any previous values, as cells may be reused
setText(null);
setGraphic(null);
if(empty) {
//contingency if cell is empty
} else if(driver!=null) {
setText(driver);
} else {
//driver is null
Button b = new Button("Choose Driver");
//... hook up button actions, etc
setGraphic(b);
}
}
});
@Override
public void start(Stage primaryStage) {
TableView<StringProperty> table = new TableView<>();
// fill table
for (int i = 0; i < 20; i++) {
table.getItems().add(new SimpleStringProperty());
}
TableColumn<StringProperty, String> column = new TableColumn<>();
column.setCellValueFactory(TableColumn.CellDataFeatures::getValue); // returns the row item itself
column.setCellFactory(col -> new TableCell<StringProperty, String>() {
private final Button button;
{
button = new Button("Set Value...");
button.setOnAction(evt -> {
TextInputDialog dialog = new TextInputDialog();
Optional<String> opt = dialog.showAndWait();
String result = opt.orElse(null);
if (result != null) {
ObservableValue<String> ov = getTableColumn().getCellObservableValue(getIndex());
if (ov instanceof WritableValue) {
((WritableValue) ov).setValue(result);
}
}
});
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
// empty cell
setText("");
setGraphic(null);
} else {
if (item == null) {
// editable cell
setText("");
setGraphic(button);
} else {
// uneditable cell
setText(item);
setGraphic(null);
}
}
}
});
table.getColumns().add(column);
Scene scene = new Scene(table);
primaryStage.setScene(scene);
primaryStage.show();
}