可水平滚动的 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 在水平滚动而不是垂直中使用单元格