gpt4 book ai didi

javafx - 如何让 JavaFX TreeView 在节点扩展时表现一致?

转载 作者:行者123 更新时间:2023-12-04 15:43:19 26 4
gpt4 key购买 nike

我有一个 JavaFX TreeView有一个看不见的根和一把“文件夹”TreeItems有很多"file"TreeItems作为 child 。 “文件夹”TreeItems通常适合在 TreeView 内没有任何滚动条。

invisible-root/
folder/
folder/
folder/
file
file
file
...
file

有时,当我展开“文件夹”时 TreeItem , 滚动条出现,但 滚动位置保持不变。 (这就是我想要的!)但是,有时,扩展 TreeItem导致出现滚动条和 TableView 滚动到最后一个 child 扩展 TreeItem !

这是非常出乎意料和令人惊讶的,尤其是因为我很难预测我会看到以下两种行为中的哪一种:(1)原地不动,或(2)滚动到最后一项。就我个人而言,我认为行为 (1) 不那么令人惊讶且更可取。

关于如何处理这个问题的任何想法?

我在 Java8u31 上看到了这种行为。

最佳答案

问题出在 VirtualFlow 中。在 layoutChildren() 中有这个部分:

 if (lastCellCount != cellCount) {
// The cell count has changed. We want to keep the viewport
// stable if possible. If position was 0 or 1, we want to keep
// the position in the same place. If the new cell count is >=
// the currentIndex, then we will adjust the position to be 1.
// Otherwise, our goal is to leave the index of the cell at the
// top consistent, with the same translation etc.
if (position == 0 || position == 1) {
// Update the item count
// setItemCount(cellCount);
} else if (currentIndex >= cellCount) {
setPosition(1.0f);
// setItemCount(cellCount);
} else if (firstCell != null) {
double firstCellOffset = getCellPosition(firstCell);
int firstCellIndex = getCellIndex(firstCell);
// setItemCount(cellCount);
adjustPositionToIndex(firstCellIndex);
double viewportTopToCellTop = -computeOffsetForCell(firstCellIndex);
adjustByPixelAmount(viewportTopToCellTop - firstCellOffset);
}

如果位置为 1.0(== 滚动到底部),则会出现问题,因为在这种情况下没有重新计算。一种解决方法是覆盖 TreeViewSkin 以提供您自己的 VirtualFlow 并修复那里的行为。

下面的代码旨在说明问题,它不是真正的解决方案,如果您真的想修复它,它只是一个起点:
import com.sun.javafx.scene.control.skin.TreeViewSkin;
import com.sun.javafx.scene.control.skin.VirtualFlow;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.IndexedCell;
import javafx.scene.control.Skin;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TreeViewScrollBehaviour extends Application {

@Override
public void start(Stage primaryStage) {

TreeView treeView = new TreeView() {
@Override
protected Skin createDefaultSkin() {
return new TTreeViewSkin(this); //To change body of generated methods, choose Tools | Templates.
}

};
TreeItem<String> treeItem = new TreeItem<String>("Root");
for (int i = 0; i < 20; i++) {
TreeItem<String> treeItem1 = new TreeItem<>("second layer " + i);
treeItem.getChildren().add(treeItem1);
for (int j = 0; j < 20; j++) {
treeItem1.getChildren().add(new TreeItem<>("Third Layer " + j));

}

}

treeView.setRoot(treeItem);
StackPane root = new StackPane();
root.getChildren().addAll(treeView);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}

class TTreeViewSkin<T extends IndexedCell> extends TreeViewSkin<T> {

public TTreeViewSkin(TreeView treeView) {
super(treeView);
}

@Override
protected VirtualFlow createVirtualFlow() {
return new TVirtualFlow<T>(); //To change body of generated methods, choose Tools | Templates.
}

}

class TVirtualFlow<T extends IndexedCell> extends VirtualFlow<T> {

@Override
public double getPosition() {
double position = super.getPosition();
if (position == 1.0d) {
return 0.99999999999;
}
return super.getPosition(); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void setPosition(double newPosition) {
if (newPosition == 1.0d) {
newPosition = 0.99999999999;
}
super.setPosition(newPosition); //To change body of generated methods, choose Tools | Templates.
}

}
}

关于javafx - 如何让 JavaFX TreeView 在节点扩展时表现一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29402412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com