可水平滚动的 TableView 的右列未完全显示

Posted

技术标签:

【中文标题】可水平滚动的 TableView 的右列未完全显示【英文标题】:Right column of a horizontally-scrollable TableView is not showing completely 【发布时间】:2017-01-27 09:37:01 【问题描述】:

我有一个包含许多列的 TableView,因此我的表格可以水平滚动。如果我让单元格内容左对齐,它看起来像预期的那样:

将其更改为右对齐后,最后一列的末尾部分会被垂直滚动滑块覆盖。所以并不是所有的内容都是可见的:

知道怎么解决吗?

TableView 类:

class DataTableView 

private TableView <DataTableModel> dataTable = new TableView<>();

DataTableView(DataObject dataObject)

    dataTable.setId("dataTable");
    dataTable.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);

    populateTable(dataObject);


private void populateTable(DataObject dataObject)

    dataTable.getItems().clear();
    dataTable.getColumns().clear();
    dataTable.setPlaceholder(new Label("Loading..."));

    Task<Void> task = new Task<Void>()
    
        @Override
        protected Void call() throws Exception
        
            List <String>headerTexts = new ArrayList<>();

            dataObject.getColumnsDataTable().forEach(name ->
                                headerTexts.add(name.getName()+'\n'+name.getUnit()));

            Platform.runLater(new Runnable()
            
                @Override
                public void run()
                
                    dataTable.getColumns().add(createIndexColumn());

                    for (int columnIndex = 0; columnIndex < headerTexts.size(); columnIndex++)
                    
                        dataTable.getColumns().add(
                                createColumn(columnIndex, headerTexts.get(columnIndex)));
                    
                
            );

            Platform.runLater(new Runnable()
            
                @Override
                public void run()
                
                    for(DataTableModel data : prepareDataModel(dataObject))
                    
                        dataTable.getItems().add(data);
                    
                
            );
            return null;
        
    ;
    Thread thread = new Thread(task);
    thread.setDaemon(true);
    thread.start();


private TableColumn <DataTableModel,String>  createIndexColumn ()

    TableColumn<DataTableModel,String> column = new TableColumn< >("No");

    column.setSortable(false);
    column.setCellFactory(col ->
    
        TableCell<DataTableModel, String> cell = new TableCell<>();
        cell.textProperty().bind(Bindings.when(cell.emptyProperty())
                .then("")
                .otherwise(cell.indexProperty().add(1).asString()));

        return cell ;
    );
    return column;


private TableColumn <DataTableModel, String> createColumn(final int columnIndex, String columnTitle )

    TableColumn<DataTableModel, String> column = new TableColumn<>(columnTitle);

    column.setCellValueFactory(cellData -> cellData.getValue().getRow().get(columnIndex));

    column.setSortable(false);

    return column;


private ObservableList <DataTableModel> prepareDataModel(DataObject dataObject)

    ObservableList <DataTableModel> dataTableModel = FXCollections.observableArrayList();
    dataObject.getDataTableData().forEach(row -> dataTableModel.add(new DataTableModel(row)));

    return dataTableModel;


public TableView getDataTableView ()
    return dataTable;

第二张截图的 CSS:

#dataTable .table-cell 
    -fx-alignment: center-right;
    -fx-padding: 0 0 0 0;

表模型:

public class DataTableModel 

    private ObservableList<StringProperty> row = FXCollections.observableArrayList();

    public DataTableModel(List <String> data)
    
        data.forEach(element -> row.add(new SimpleStringProperty(element)));
    

    public void setRow(ObservableList<StringProperty> row) 
        this.row = row;
    

    public ObservableList<StringProperty> getRow() 
        return row;
    

    public int size() 
        return row.size();
    

【问题讨论】:

如果可能的话 setPrefWidth for TableView 它可以提供帮助。如果为列设置任何宽度,最好的方法是设置列宽度之和。 什么是结果?有用吗? 不幸的是,TableView 的 setPrefWidth 不起作用。单元格内容的末尾部分仍然隐藏在滚动滑块下。 如果可以附上您的代码,它将更有可能提供帮助。 我已将代码添加到原始帖子中。谢谢。 【参考方案1】:

您使用什么 JavaFx 版本?我在使用 JavaFX 8 时遇到了同样的问题。使用较新版本时问题已解决(至少使用 JavaFX 12 或更高版本已修复)。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review

以上是关于可水平滚动的 TableView 的右列未完全显示的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 swift 3 创建可水平滚动的 tableview 和 collectionview

iPhone Tableview 在水平滚动而不是垂直中使用单元格

使用 flexbox CSS 的左列和堆叠的右列 [重复]

在Uitableviewcontroller内创建水平可滚动区域

如何显示在 tableview 之外并且可滚动的父视图?

使两列分别可滚动和视口剩余长度的高度