为javaFx表视图中的每一行动态填充combobox列表

我在java Fx中创建了一个表视图,表视图中的一列包含ComboBoxTableCell。请在下面找到表视图的代码

public class TabViewController { @FXML private TabPane cnfmTab; @FXML private TableView partsTable; @FXML private TableColumn column1; @FXML private TableColumn column2; @FXML private TableColumn column3; private ObservableList tableData = FXCollections.observableArrayList(); private ObservableList column1List; @FXML public void initialize(){ tableData = FXCollections.observableArrayList(callDAO.getTableData(1)); column1.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getColumn1())); column1 .setCellFactory(new Callback<TableColumn, TableCell>() { @SuppressWarnings({ "rawtypes", "unchecked" }) public TableCell call(TableColumn p) { ComboBoxTableCell cell = new ComboBoxTableCell(column1List){ @Override public void updateItem(Object item, boolean empty) { } }; cell.setAlignment(Pos.CENTER); return cell; } }); column1.setOnEditCommit( new EventHandler<CellEditEvent>() { @Override public void handle(CellEditEvent t) { }; } ); } partsTable.setItems(tableData); } 

数据对象:

 public class TabVO { private String column1; private String column2; private String column3; private ObservableList column1List; /* Getters and Setters */ } 

在上面的代码中,表的每一行都是TabVo类型。

在表中,column1是类型combobox。 现在,column1combobox的列表由’column1List’填充,’column1List’在’TabViewController’中声明,因此表视图的所有行都填充了相同的下拉列表。

但我希望表中的每一行都填充TabVo中存在的不同列表。

任何人都可以告诉我如何访问TabVo对象并使用TabVo中的列表填充combobox?

这是一个MVCE,其中包含问题中描述的用例:

 import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.cell.TextFieldTableCell; import javafx.scene.layout.HBox; import javafx.stage.Stage; import javafx.util.Callback; public class ComboBoxCellTableExample extends Application { private final TableView table = new TableView<>(); private final ObservableList data = FXCollections.observableArrayList( new TabVo( "2222", "column2", FXCollections.observableArrayList( "111", "2222", "3333" ) ), new TabVo( "bbbb", "column2", FXCollections.observableArrayList( "aaaa", "bbbb", "ccccc" ) ), new TabVo( "6666", "column2", FXCollections.observableArrayList( "444", "5555", "6666" ) ), new TabVo( "7777", "column2", FXCollections.observableArrayList( "7777", "8888", "99999" ) ), new TabVo( "hhhh", "column2", FXCollections.observableArrayList( "hhhh", "jjjj", "kkkkk" ) ) ); @Override public void start( Stage stage ) { Scene scene = new Scene( new Group() ); stage.setWidth( 450 ); stage.setHeight( 550 ); table.setEditable( true ); Callback cellFactory = new Callback() { @Override public TableCell call( TableColumn p ) { return new ComboBoxCell(); } }; TableColumn column1Col = new TableColumn( "Column 1" ); column1Col.setMinWidth( 100 ); column1Col.setCellValueFactory( new PropertyValueFactory( "column1" ) ); column1Col.setCellFactory( cellFactory ); column1Col.setOnEditCommit( new EventHandler>() { @Override public void handle( TableColumn.CellEditEvent t ) { (( TabVo ) t.getTableView().getItems().get( t.getTablePosition().getRow() )).setColumn1( t.getNewValue() ); } } ); TableColumn column2Col = new TableColumn( "Column 2" ); column2Col.setMinWidth( 100 ); column2Col.setCellValueFactory( new PropertyValueFactory( "column2" ) ); column2Col.setCellFactory( TextFieldTableCell.forTableColumn() ); column2Col.setOnEditCommit( new EventHandler>() { @Override public void handle( TableColumn.CellEditEvent t ) { (( TabVo ) t.getTableView().getItems().get( t.getTablePosition().getRow() )).setColumn2( t.getNewValue() ); } } ); table.setItems( data ); table.getColumns().addAll( column1Col, column2Col ); (( Group ) scene.getRoot()).getChildren().add( table ); stage.setScene( scene ); stage.show(); } class ComboBoxCell extends TableCell { private ComboBox comboBox; public ComboBoxCell() { comboBox = new ComboBox<>(); } @Override public void startEdit() { if ( !isEmpty() ) { super.startEdit(); comboBox.setItems( getTableView().getItems().get( getIndex() ).getColumn1List() ); comboBox.getSelectionModel().select( getItem() ); comboBox.focusedProperty().addListener( new ChangeListener() { @Override public void changed( ObservableValue observable, Boolean oldValue, Boolean newValue ) { if ( !newValue ) { commitEdit( comboBox.getSelectionModel().getSelectedItem() ); } } } ); setText( null ); setGraphic( comboBox ); } } @Override public void cancelEdit() { super.cancelEdit(); setText( ( String ) getItem() ); setGraphic( null ); } @Override public void updateItem( String item, boolean empty ) { super.updateItem( item, empty ); if ( empty ) { setText( null ); setGraphic( null ); } else { if ( isEditing() ) { setText( null ); setGraphic( comboBox ); } else { setText( getItem() ); setGraphic( null ); } } } } public static void main( String[] args ) { launch( args ); } public static class TabVo { private String column1; private String column2; private ObservableList column1List; private TabVo( String column1, String column2, ObservableList column1List ) { this.column1 = column1; this.column2 = column2; this.column1List = column1List; } public String getColumn1() { return column1; } public void setColumn1( String column1 ) { this.column1 = column1; } public String getColumn2() { return column2; } public void setColumn2( String column2 ) { this.column2 = column2; } public ObservableList getColumn1List() { return column1List; } public void setColumn1List( ObservableList column1List ) { this.column1List = column1List; } } } 

第一列在编辑模式下使用combobox,而第二列在文本字段中使用默认工厂。

您需要为单元格定义CellValueFactory。 此工厂通过使用给定行的表项列表的当前值来定义将在列中显示的值。 看到这个链接: javafx中的Cell工厂