gpt4 book ai didi

JavaFX TabPane 重新排序错误,正在寻找解决方法

转载 作者:行者123 更新时间:2023-11-30 05:20:15 26 4
gpt4 key购买 nike

我在 JavaFX TabPane 中发现了一个小错误,正在寻找解决方法。我正在运行 JavaFX 13.0.1。

它是如何发生的:

TabPane 的 DragPolicy 必须设置为 TabPane.TabDragPolicy.REORDER

您可以通过键盘快捷键 CTRL + TABCTRL + SHIFT + TAB 在选项卡之间导航。

但是,如果我将最后一个选项卡拖到最左边并将其释放回原来的位置(这样就不会发生任何变化),这些键盘快捷键就会变得困惑 - 不再指向正确的下一个/上一个选项卡。

您应该能够使用以下代码简单地重现它:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Test extends Application {

@Override
public void start(Stage primaryStage) {
TabPane tabPane = new TabPane();
tabPane.setTabDragPolicy(TabPane.TabDragPolicy.REORDER);

tabPane.getTabs().add(new Tab("First"));
tabPane.getTabs().add(new Tab("Second"));
tabPane.getTabs().add(new Tab("Third"));
tabPane.getTabs().add(new Tab("Fourth"));
tabPane.getTabs().add(new Tab("Fifth"));

StackPane root = new StackPane();
root.getChildren().add(tabPane);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("TabPane bug");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}

最佳答案

一个有趣的错误。 TabPane.getTabs() 似乎返回一个列表,该列表可能反射(reflect)也可能不反射(reflect)选项卡的视觉顺序。但导航键始终依赖于 getTabs() 顺序,而不是视觉顺序。

一种解决方法是使用标签作为每个选项卡的图形,同时将选项卡的文本保留为空。然后,您可以通过检查每个此类标签的视觉位置来自行正确排序选项卡。

import java.util.List;
import java.util.ArrayList;

import javafx.beans.Observable;
import javafx.geometry.Bounds;
import javafx.geometry.NodeOrientation;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TabDragTest2 extends Application {

private static Tab createTab(String title) {
Tab tab = new Tab();
tab.setGraphic(new Label(title));
return tab;
}

@Override
public void start(Stage primaryStage) {
TabPane tabPane = new TabPane();
tabPane.setTabDragPolicy(TabPane.TabDragPolicy.REORDER);

tabPane.getTabs().add(createTab("First"));
tabPane.getTabs().add(createTab("Second"));
tabPane.getTabs().add(createTab("Third"));
tabPane.getTabs().add(createTab("Fourth"));
tabPane.getTabs().add(createTab("Fifth"));

tabPane.getTabs().addListener((Observable o) -> {
List<Tab> tabs = new ArrayList<>(tabPane.getTabs());

NodeOrientation orientation = tabPane.getEffectiveNodeOrientation();
boolean ltr = orientation == NodeOrientation.LEFT_TO_RIGHT;

tabs.sort((t1, t2) -> {
Node title1 = t1.getGraphic();
Node title2 = t2.getGraphic();
Bounds title1Bounds =
title1.localToScene(title1.getLayoutBounds());
Bounds title2Bounds =
title2.localToScene(title2.getLayoutBounds());

if (tabPane.getSide().isHorizontal()) {
if (ltr) {
return Double.compare(
title1Bounds.getMinX(), title2Bounds.getMinX());
} else {
return Double.compare(
title2Bounds.getMaxX(), title1Bounds.getMaxX());
}
} else {
return Double.compare(
title1Bounds.getMinY(), title2Bounds.getMinY());
}
});

if (!tabPane.getTabs().equals(tabs)) {
Platform.runLater(() -> tabPane.getTabs().setAll(tabs));
}
});

StackPane root = new StackPane();
root.getChildren().add(tabPane);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("TabPane bug");
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}

关于JavaFX TabPane 重新排序错误,正在寻找解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59704936/

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