通过 mouse/key 事件禁用 SpreadsheetView 单元格选择,但保留滚动视图的能力
Disable SpreadsheetView cell selection via mouse/key events, but retain ability to scroll the view
我正在编写一个 Excel 导入向导,它将用户的电子表格加载到 ControlsFX SpreadsheetView 中。然后,用户可以通过一组组合框识别要导入到应用程序中的相关列(即名字和姓氏等)。每个组合框都包含可用列的列表。当用户在组合框中做出选择时,相应的列将添加到选择模型的选择范围中。
列选择应仅通过组合框完成,用户点击电子表格视图中的单元格应被忽略(即,不更改选择模型内容)。
但是,我找不到禁用鼠标点击单元格或列 headers 的方法。 related question 关于如何禁用对 TableView 的点击的解决方案没有提供令人满意的答案:setMouseTransparent(true)
基本上禁用了整个视图。
在我的例子中,用户必须能够滚动视图才能找到相关的列,因为并非该应用的所有用户都按照相同的列顺序构建他们的电子表格,并且如果不滚动,该列可能不可见水平地。
因此 re-iterate:我需要消耗鼠标点击 单元格 和 列 headers 以防止更改使用组合框所做的列选择。我该怎么做呢? (仅供参考:在电子表格视图中使用鼠标事件 [setOnMousePressed|Released|Clicked(mEvent -> mEvent.consume()
] 无效。)
实际上,当您使用 setOnMousePressed 方法时,您是在添加一个 EventHandler。
EventHandler 发生在后面的冒泡事件链中。
您想要的是添加一个 EventFilter,它将在 SpreadsheetView 拥有事件之前捕获事件。
例如,我做了这个:
spreadSheetView.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
event.consume();
}
});
spreadSheetView.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
event.consume();
}
});
spreadSheetView.addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
event.consume();
}
});
它正在运行。虽然我真的不知道这样操作的副作用..
我正在编写一个 Excel 导入向导,它将用户的电子表格加载到 ControlsFX SpreadsheetView 中。然后,用户可以通过一组组合框识别要导入到应用程序中的相关列(即名字和姓氏等)。每个组合框都包含可用列的列表。当用户在组合框中做出选择时,相应的列将添加到选择模型的选择范围中。
列选择应仅通过组合框完成,用户点击电子表格视图中的单元格应被忽略(即,不更改选择模型内容)。
但是,我找不到禁用鼠标点击单元格或列 headers 的方法。 related question 关于如何禁用对 TableView 的点击的解决方案没有提供令人满意的答案:setMouseTransparent(true)
基本上禁用了整个视图。
在我的例子中,用户必须能够滚动视图才能找到相关的列,因为并非该应用的所有用户都按照相同的列顺序构建他们的电子表格,并且如果不滚动,该列可能不可见水平地。
因此 re-iterate:我需要消耗鼠标点击 单元格 和 列 headers 以防止更改使用组合框所做的列选择。我该怎么做呢? (仅供参考:在电子表格视图中使用鼠标事件 [setOnMousePressed|Released|Clicked(mEvent -> mEvent.consume()
] 无效。)
实际上,当您使用 setOnMousePressed 方法时,您是在添加一个 EventHandler。 EventHandler 发生在后面的冒泡事件链中。
您想要的是添加一个 EventFilter,它将在 SpreadsheetView 拥有事件之前捕获事件。
例如,我做了这个:
spreadSheetView.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
event.consume();
}
});
spreadSheetView.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
event.consume();
}
});
spreadSheetView.addEventFilter(MouseEvent.MOUSE_RELEASED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
event.consume();
}
});
它正在运行。虽然我真的不知道这样操作的副作用..