- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在正在学习 JavaFX,但我似乎无法做对一件事。基本上我想做的是一个具有多重选择的 TreeTableView,在我尝试对列表进行排序之前它工作得很好。
代码如下(示例 15-1 来自 http://docs.oracle.com/javase/8/javafx/user-interface-tutorial/tree-table-view.htm#CJAEIFDC 的一列 TreeTableView):
import javafx.application.Application;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableColumn.CellDataFeatures;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;
public class TreeTableViewSample extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(Stage stage) {
stage.setTitle("Tree Table View Samples");
final Scene scene = new Scene(new Group(), 200, 400);
Group sceneRoot = (Group)scene.getRoot();
//Creating tree items
final TreeItem<String> childNode1 = new TreeItem<>("Child Node 1");
final TreeItem<String> childNode2 = new TreeItem<>("Child Node 2");
final TreeItem<String> childNode3 = new TreeItem<>("Child Node 3");
//Creating the root element
final TreeItem<String> root = new TreeItem<>("Root node");
root.setExpanded(true);
//Adding tree items to the root
root.getChildren().setAll(childNode1, childNode2, childNode3);
//Creating a column
TreeTableColumn<String,String> column = new TreeTableColumn<>("Column");
column.setPrefWidth(150);
//Defining cell content
column.setCellValueFactory((CellDataFeatures<String, String> p) ->
new ReadOnlyStringWrapper(p.getValue().getValue()));
//Creating a tree table view
final TreeTableView<String> treeTableView = new TreeTableView<>(root);
TreeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); //Setting SelectionMode to MULTIPLE
treeTableView.getColumns().add(column);
treeTableView.setPrefWidth(152);
treeTableView.setShowRoot(true);
sceneRoot.getChildren().add(treeTableView);
stage.setScene(scene);
stage.show();
}
}
我添加了这一行:
TreeTableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); //Setting SelectionMode to MULTIPLE
一切正常,但当我选择多行并尝试对列进行排序时,仅 Activity 行(最后选择的)保持选中状态。
排序时控制台会给出以下输出:
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException
at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(Unknown Source)
at javafx.collections.ListChangeListener$Change.getAddedSubList(Unknown Source)
at javafx.scene.control.TreeTableView$TreeTableViewArrayListSelectionModel.handleSelectedCellsListChangeEvent(Unknown Source)
at javafx.scene.control.TreeTableView$TreeTableViewArrayListSelectionModel.access$2100(Unknown Source)
at javafx.scene.control.TreeTableView.sort(Unknown Source)
at javafx.scene.control.TreeTableView.doSort(Unknown Source)
at javafx.scene.control.TreeTableView.lambda$new$115(Unknown Source)
at javafx.scene.control.TreeTableView$$Lambda$99/1473718685.onChanged(Unknown Source)
at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source)
at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(Unknown Source)
at javafx.collections.ObservableListBase.fireChange(Unknown Source)
at javafx.collections.ListChangeBuilder.commit(Unknown Source)
at javafx.collections.ListChangeBuilder.endChange(Unknown Source)
at javafx.collections.ObservableListBase.endChange(Unknown Source)
at javafx.collections.ModifiableObservableListBase.setAll(Unknown Source)
at javafx.collections.ObservableListBase.setAll(Unknown Source)
at com.sun.javafx.scene.control.skin.TableColumnHeader.sortColumn(Unknown Source)
at com.sun.javafx.scene.control.skin.TableColumnHeader.lambda$static$55(Unknown Source)
at com.sun.javafx.scene.control.skin.TableColumnHeader$$Lambda$152/863692449.handle(Unknown Source)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.event.Event.fireEvent(Unknown Source)
at javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.scene.Scene$MouseHandler.access$1500(Unknown Source)
at javafx.scene.Scene.impl_processMouseEvent(Unknown Source)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$350(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$$Lambda$224/2145564822.get(Unknown Source)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at com.sun.glass.ui.View.notifyMouse(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source)
at com.sun.glass.ui.win.WinApplication$$Lambda$36/2117255219.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
预先感谢您的帮助。
最佳答案
我昨天遇到同样的问题时偶然发现了您的帖子。可惜没有人回复你,我决定自己调查一下。令人难以置信的是,如此常见的功能中的错误可能多年来都没有被注意到和修复......
因为在我看来,它就像 JavaFX 中 TreeTableView.TreeTableViewArrayListSelectionModel
中的错误。有一个处理程序可以更新选择以响应数据模型中的更改:
private EventHandler<TreeItem.TreeModificationEvent<S>> treeItemListener = new EventHandler<TreeItem.TreeModificationEvent<S>>() {
@Override public void handle(TreeItem.TreeModificationEvent<S> e) {
if (getSelectedIndex() == -1 && getSelectedItem() == null) return;
<...>
在某个时刻(第 2421 行)它处理排序情况(即排列):
} else if (e.wasPermutated()) {
// This handles the sorting case where nothing was added or
// removed, but the location of the selected index / item
// has likely changed. This was added to fix RT-30156 and
// unit tests exist to prevent it from regressing.
quietClearSelection();
select(oldSelectedItem);
} else if (e.wasAdded()) {
此代码尝试根据其内容(而不是排序期间可能更改的行号)重新选择正确的项目。但不幸的是它没有考虑多选的情况,排序后只留下一项被选中。
发生崩溃(异常)是因为 TreeTableView
的 sort()
方法似乎解决了相同的问题(排序完成后恢复正确的选择),通过保存排序前后的选择索引,并发出排列事件:
final List<TreeTablePosition<S,?>> prevState = new ArrayList<>(getSelectionModel().getSelectedCells());
final int itemCount = prevState.size();
<...>
final TreeTableViewArrayListSelectionModel<S> sm = (TreeTableViewArrayListSelectionModel<S>) getSelectionModel();
final ObservableList<TreeTablePosition<S, ?>> newState = sm.getSelectedCells();
List<TreeTablePosition<S, ?>> removed = new ArrayList<>();
for (int i = 0; i < itemCount; i++) {
TreeTablePosition<S, ?> prevItem = prevState.get(i);
if (!newState.contains(prevItem)) {
removed.add(prevItem);
}
}
if (!removed.isEmpty()) {
// the sort operation effectively permutates the selectedCells list,
// but we cannot fire a permutation event as we are talking about
// TreeTablePosition's changing (which may reside in the same list
// position before and after the sort). Therefore, we need to fire
// a single add/remove event to cover the added and removed positions.
ListChangeListener.Change<TreeTablePosition<S, ?>> c = new NonIterableChange.GenericAddRemoveChange<>(0, itemCount, removed, newState);
sm.handleSelectedCellsListChangeEvent(c);
}
在最后一行之前,创建 onIterableChange.GenericAddRemoveChange
对象,同时假设 newState
列表具有 itemCount
元素(而 >newState
将始终包含 1 个元素,如上所述),并且在尝试从中获取 itemCount
元素时会崩溃。
现在,你能做些什么呢?要彻底修复它,您需要:
TreeTableView
并重写sort()
方法,或者TreeTableView.SetSelectionModel()
提供您自己的 SelectionModel
实现(可能基于 TreeTableViewArrayListSelectionModel
实现)这两种方法都不简单,因为代码大量使用可私有(private)访问的成员。使用第一个解决方案,您还将面临 FXMLLoader
的问题,它只能创建 TreeTableView
(而不是您的子类 MyTreeTableView
),但是您应该能够手动创建该对象。
我想我会坚持以下解决方法,每当表格排序时清除选择(在我的情况下不会发生很多):
myTreeTable.setOnSort(event -> {
if(myTreeTable.getSelectionModel().getSelectedIndices().size() > 1)
myTreeTable.getSelectionModel().clearSelection();
});
希望这有帮助!
关于选择多行进行排序时发生 JavaFX TreeTableView 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29134625/
我有一个TreeTableView,其中每个节点都有一个图标。当我伸展树(Splay Tree)时,一切正常,但是当我折叠树时,不再可见的项目的图标会被留下。 行和文本被删除,但图标仍然“自由 flo
我正在使用 TreeTableView 来显示树的内容。树中的排序顺序是手动的,我希望能够拖放项目。 如何在 TreeTableView 中拖放项目? 最佳答案 一种方法是使用“treeTableVi
我需要将树 TableView 的列中显示的值居中,如何将位置从左侧更改为中心? final TreeTableColumn dataColumn = new TreeTableColumn<>("D
我的问题是如何使用我自己的Comparator创建一个treetableview(JavaFX8)。 我找到了一些例子,例如 JavaFX TableView Sort Policy但它们都是Tabl
我想将图像添加到 TreeTableView 中的每个节点。为了做到这一点,我编写了以下内容(根据 Google 找到的一些页面): 调用更新 View Controller 中的 View publ
如何获取对 TreeTableView 中展开/折叠“箭头”的引用? 我无法提供任何代码,因为我真的不知道要寻找什么。 这是一张显示我需要的图片。突出显示的箭头是我需要的。 我想删除它,同时保留折叠/
我有以下 FXML:
我们努力实现以下目标: 当在 JavaFX TreeTableView 中选择一个节点时,还应该选择“根路径”,即父节点、祖父节点等。在这种情况下选择意味着用不同的背景颜色突出显示,请参见图像(在示例
我现在正在学习 JavaFX,但我似乎无法做对一件事。基本上我想做的是一个具有多重选择的 TreeTableView,在我尝试对列表进行排序之前它工作得很好。 代码如下(示例 15-1 来自 http
我想要实现的目标是或多或少拥有 Sale 对象,当它扩展为在该 Sale 对象下显示 SaleTransaction 对象时。类似于 Code Project 的图像中显示了想要的内容 除了读取之外,
thisColumn.setCellFactory(new Callback, TreeTableCell>() { @Override public TreeTableCell ca
我正在使用 JavaFX 中的 TreeTableView 类来实现分组股票行情观察列表。排序时,我只想对股票进行排序(而不是组)。目前,当我单击“符号”列(例如)时,它会对每个组中的股票进行排序(正
我注意到 TreeTableView 中有一个奇怪的 NPE 如果您在没有行的表格中双击,就会发生这种情况。我将附上屏幕截图以准确说明我的意思。 我纯粹来自 JavaFx 它与我的代码无关。我也做了一
我正在使用 TreeTableView ,我想根据所选行中的数据更改与上下文菜单关联的菜单项。 假设我有一个结构如下的表: 访客 访客1 访客2 访客 3 喋喋不休 喋喋不休1 喋喋不休2 在此表中,
我有一个 JFXTreeTableView,我想将每一列的数据文本居中。 有一个我创建列的代码: JFXTreeTableColumn DrinkColumn = new JFXTreeTableCo
我正在尝试设置 TreeTableView 的背景。 使用的 CSS 样式: .tree-table-cell, cell{ -fx-background-color: rgba(0, 0, 0
我一直在试验 JDK 8 中的 TreeTableView。在我的程序启动并运行后,我注意到一个问题,即当我滚动时,行会被清空。我已经尝试了一切,从重置单元格的可见性,更新时希望它在更新时重绘,甚至重
我想修改 TreeTableView 的点击行为,但老实说,我不确定这样做的预期方式应该是什么样子,或者是否需要更改它以任何方式。 大多数用户提示当前的行为不一致。有时单击一个单元格已经折叠/伸展树(
与 TreeTableView 一起工作时我意识到当您向下滚动表格并双击最后一个展开/折叠箭头时,所有项目都会消失。但是,当您再次滚动时,所有项目都会重新出现。当然,当你有足够的元素时会发生这种情况,
我在 FX、CSS 和 TreeTableView 方面遇到了一些问题。我有包含蓝色超链接的单元格。现在,如果选择该单元格,背景就会变成蓝色,因此该链接实际上是不可见的。我现在想使用样式表更改所选单元
我是一名优秀的程序员,十分优秀!