加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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?

请找到我需要的快照:

enter image description here

这是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);
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读