当前位置: 首页 > 面试题库 >

动态填充javaFx表视图中每一行的组合框列表

金晗日
2023-03-14
问题内容

我已经在Java Fx中创建了一个表格视图,表格视图中的列之一由ComboBoxTableCell组成。请在下面的表格视图代码中找到

public class TabViewController {
    @FXML
    private TabPane cnfmTab;

    @FXML
    private TableView<TabVO> partsTable;

    @FXML
    private TableColumn<TabVO, String> column1;

    @FXML
    private TableColumn<TabVO, String> column2;

    @FXML
    private TableColumn<TabVO, String> column3;

    private ObservableList<TabVO> tableData = FXCollections.observableArrayList();

    private ObservableList<String> column1List;

    @FXML
    public void initialize(){

    tableData = FXCollections.observableArrayList(callDAO.getTableData(1));

    column1.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getColumn1()));

    column1
        .setCellFactory(new Callback<TableColumn<tabVO, String>, TableCell<tabVO, String>>() {
            @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<tabVO, String>>() {
                    @Override
                    public void handle(CellEditEvent<tabVO,String> t) {

                    };
                }
                );
    }

    partsTable.setItems(tableData);
}

数据对象:

public class TabVO {


    private String column1;

    private String column2;

    private String column3;

    private ObservableList<String> column1List;


    /* Getters and Setters */

}

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

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

但是我想用TabVo中存在的不同列表填充表的每一行。

谁能告诉我如何访问TabVo对象以及如何用TabVo中存在的列表填充组合框?


问题答案:

这是一个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<TabVo> table = new TableView<>();
    private final ObservableList<TabVo> data
            = FXCollections.observableArrayList(
                    new TabVo( "2222", "column2", FXCollections.<String>observableArrayList( "111", "2222", "3333" ) ),
                    new TabVo( "bbbb", "column2", FXCollections.<String>observableArrayList( "aaaa", "bbbb", "ccccc" ) ),
                    new TabVo( "6666", "column2", FXCollections.<String>observableArrayList( "444", "5555", "6666" ) ),
                    new TabVo( "7777", "column2", FXCollections.<String>observableArrayList( "7777", "8888", "99999" ) ),
                    new TabVo( "hhhh", "column2", FXCollections.<String>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<TableColumn, TableCell> cellFactory = new Callback<TableColumn, TableCell>()
        {
            @Override
            public TableCell call( TableColumn p )
            {
                return new ComboBoxCell();
            }
        };

        TableColumn column1Col = new TableColumn( "Column 1" );
        column1Col.setMinWidth( 100 );
        column1Col.setCellValueFactory( new PropertyValueFactory<TabVo, String>( "column1" ) );
        column1Col.setCellFactory( cellFactory );
        column1Col.setOnEditCommit(
                new EventHandler<TableColumn.CellEditEvent<TabVo, String>>()
                {
                    @Override
                    public void handle( TableColumn.CellEditEvent<TabVo, String> 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<TabVo, String>( "column2" ) );
        column2Col.setCellFactory( TextFieldTableCell.forTableColumn() );
        column2Col.setOnEditCommit(
                new EventHandler<TableColumn.CellEditEvent<TabVo, String>>()
                {
                    @Override
                    public void handle( TableColumn.CellEditEvent<TabVo, String> 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<TabVo, String>
    {

        private ComboBox<String> 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<Boolean>()
                {
                    @Override
                    public void changed( ObservableValue<? extends Boolean> 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<String> column1List;


        private TabVo( String column1, String column2, ObservableList<String> 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<String> getColumn1List()
        {
            return column1List;
        }


        public void setColumn1List( ObservableList<String> column1List )
        {
            this.column1List = column1List;
        }

    }

}

第一列在编辑模式下使用组合框,而第二列对文本字段使用默认工厂。



 类似资料:
  • 我试图避免将一大堆数字硬编码到我的JavaFX ComboBox中,但我不知道有任何其他方法可以做到这一点。目前我正在这样做: 然而,我的目标是调用一个方法,该方法将生成一个达到某个指定上限(例如50)的数字列表。我尝试了以下方法,但它只是添加了最后一个,而不是全部50:

  • 我想在一个组合框中填充一些数据。这很好。但是,我想动态地改变组合框中的数据。 目前我有一个表,在组合框中,我在表列中显示数据的唯一值。现在,表数据存储在静态可观察列表变量中。我想根据表中显示的数据更改组合框中的数据。也就是说,如果存储表数据的静态可观察列表发生更改,我希望在没有手动干预的情况下更改组合框数据。 如果没有单独的静态变量用于组合框,这是否可能?

  • 我在tableview中使用的一列有问题<本栏最初用于显示我拥有的一种数据类型: 我想更改此列中显示的数据,因此我更改了FXML文件中的列名,并编写了以下内容: 我的ResearchData类编码如下: (我只保留了rang、luse和lSysteme,但我有很多其他变量都是这样写的)。 当我启动程序时,在tableview中,除Systeme列外,所有列都正确显示,我收到了以下错误消息: 我可以

  • 我无法填充从场景生成器创建的JavaFX组合框。虽然我已经搜索过了,但我找不到解决这个错误的方法。 下面的例子都不管用。 帮助将不胜感激。

  • 我正在查询Sql Server并返回一个List-我想使用此List作为我的组合框的源。下面是我正在使用的代码,它运行时没有错误,但我的组合框始终为空并且从不填充。这里有什么不正确的? 主要的Java语言 样品fxml

  • 在SpringMVC项目的控制器中,我确实有一个列表,我将其放在模型映射中,如下所示。 现在我想在thymeleaf视图中使用post方法动态填充它。为此,我使用了一个JavaScript脚本。这不是所有的html代码,但为了简单起见,我只添加了JS部分。 这是测试有效的后方法。 它向我显示了错误:错误解析模板[],模板可能不存在或任何已配置的模板解析程序都无法访问,这肯定是因为:。有没有办法动态