Javafx:TableView基于行列获取特定Table单元的图形节点
发布时间:2020-12-15 02:19:03 所属栏目:Java 来源:网络整理
导读:我有一个 JavaFX表视图组件,并使用ComboBox动态加载数据作为各列的setGraphic.我想在cellFactory添加ComboBox. 现在,当用户选择第一个ComboBox时,必须相应地设置下一列ComboBox.为此,我使用了一个选择监听器,但是如何获得其他TableColumn的ComboBox? 请找到
我有一个
JavaFX表视图组件,并使用ComboBox动态加载数据作为各列的setGraphic.我想在cellFactory添加ComboBox.
现在,当用户选择第一个ComboBox时,必须相应地设置下一列ComboBox.为此,我使用了一个选择监听器,但是如何获得其他TableColumn的ComboBox? 请找到我需要的快照: 这是TableView的片段: TableColumn< ModelInput,String > colCalibration = new TableColumn<>( "Calibration" ); TableColumn< ModelInput,String > colSamplingX = new TableColumn<>( "Sampling point X" ); TableColumn< ModelInput,String > colSamplingY = new TableColumn<>( "Sampling point Y" ); List< TableColumn< ModelInput,String > > tableColList = Stream.of( colCalibration,colSamplingX,colSamplingY ) .collect( Collectors.toList() ); tableviewCalibMatching.getColumns().addAll( tableColList ); //initialize colCalibration.setCellFactory( param -> new TableCell< ModelInput,String >() { @Override public void updateItem( String item,boolean empty ) { super.updateItem( item,empty ); if( empty ) { setText( null ); } else { ComboBox< String > comboBoxCalibMatchingNames = new ComboBox<>( listCalibNames ); comboBoxCalibMatchingNames.setPrefWidth( splitWidth ); comboBoxCalibMatchingNames.getSelectionModel().selectedItemProperty() .addListener( (ChangeListener< String >)( observable,oldValue,newValue ) -> { //TODO //How can I get ComboBox of other TableColumn,need to set according to current //selection } ); setGraphic( comboBoxCalibMatchingNames ); setContentDisplay( ContentDisplay.GRAPHIC_ONLY ); } } } ); colSamplingX.setCellFactory( param -> new TableCell< ModelInput,empty ); if( empty ) { setText( null ); } else { final ComboBox< String > comboBox = new ComboBox<>(); setGraphic( comboBox ); setContentDisplay( ContentDisplay.GRAPHIC_ONLY ); } } } ); colSamplingY.setCellFactory( param -> new TableCell< ModelInput,empty ); if( empty ) { setText( null ); } else { final ComboBox< String > comboBox = new ComboBox<>(); setGraphic( comboBox ); setContentDisplay( ContentDisplay.GRAPHIC_ONLY ); } } } ); 解决方法
试试这个:
public class Test { private final TableView<ModelInput> tableviewCalibMatching = new TableView<>(); private final TableColumn<ModelInput,String> colCalibration = new TableColumn<>("Calibration"); private final TableColumn<ModelInput,String> colSamplingX = new TableColumn<>("Sampling Point X"); private final TableColumn<ModelInput,String> colSamplingY = new TableColumn<>("Sampling Point Y"); private final ObservableList<String> listCalibNames = FXCollections.observableArrayList(); private final ObservableList<String> listSamplingXNames = FXCollections.observableArrayList(); private final ObservableList<String> listSamplingYNames = FXCollections.observableArrayList(); private final ObservableList<ModelInput> items = FXCollections.observableArrayList(); public Test() { tableviewCalibMatching.setItems(items); tableviewCalibMatching.getColumns().addAll(colCalibration,colSamplingY); colCalibration.setCellFactory(ComboBoxTableCell.forTableColumn(listCalibNames)); colSamplingX.setCellFactory(ComboBoxTableCell.forTableColumn(listSamplingXNames)); colSamplingY.setCellFactory(ComboBoxTableCell.forTableColumn(listSamplingYNames)); colCalibration.setCellValueFactory(new PropertyValueFactory<>("calibration")); colSamplingX.setCellValueFactory(new PropertyValueFactory<>("samplingX")); colSamplingY.setCellValueFactory(new PropertyValueFactory<>("samplingY")); colCalibration.setOnEditCommit(event -> { final String newCalibrationValue = event.getNewValue(); event.getRowValue().setCalibration(newCalibrationValue); // You can change the logic here based on what you need event.getRowValue().setSamplingX(listSamplingXNames.get(1)); event.getRowValue().setSamplingY(listSamplingXNames.get(1)); }); colSamplingX.setOnEditCommit(event -> { final String newSamplingXValue = event.getNewValue(); event.getRowValue().setSamplingX(newSamplingXValue); }); colSamplingY.setOnEditCommit(event -> { final String newSamplingYValue = event.getNewValue(); event.getRowValue().setSamplingY(newSamplingYValue); }); } public static class ModelInput { private final StringProperty calibration = new SimpleStringProperty(); private final StringProperty samplingX = new SimpleStringProperty(); private final StringProperty samplingY = new SimpleStringProperty(); public final StringProperty calibrationProperty() { return this.calibration; } public final String getCalibration() { return this.calibrationProperty().get(); } public final void setCalibration(final String calibration) { this.calibrationProperty().set(calibration); } public final StringProperty samplingXProperty() { return this.samplingX; } public final String getSamplingX() { return this.samplingXProperty().get(); } public final void setSamplingX(final String samplingX) { this.samplingXProperty().set(samplingX); } public final StringProperty samplingYProperty() { return this.samplingY; } public final String getSamplingY() { return this.samplingYProperty().get(); } public final void setSamplingY(final String samplingY) { this.samplingYProperty().set(samplingY); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |