Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX选项卡窗格重新排序错误,正在寻找解决方法_Java_Javafx - Fatal编程技术网

JavaFX选项卡窗格重新排序错误,正在寻找解决方法

JavaFX选项卡窗格重新排序错误,正在寻找解决方法,java,javafx,Java,Javafx,我在JavaFXTabPane中发现了一个小错误,正在寻找解决方法。我正在运行JavaFX13.0.1 它是如何发生的: TabPane的DragPolicy必须设置为TabPane.TabDragPolicy.REORDER 您可以通过键盘快捷键在选项卡之间导航CTRL+TAB&CTRL+SHIFT+TAB 然而,如果我把最后一个标签拖到最左边,然后把它放回原来的位置(这样就不会有任何变化),这些键盘快捷键就会乱七八糟——不再指向正确的下一个/上一个标签 您应该能够用以下代码简单地复制它: i

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

它是如何发生的:

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

您可以通过键盘快捷键在选项卡之间导航
CTRL+TAB
&
CTRL+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()返回一个列表,该列表可能反映也可能不反映选项卡的视觉顺序。但是导航键始终依赖于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);
    }
}
import java.util.List;
导入java.util.ArrayList;
导入javafx.beans.Observable;
导入javafx.geometry.Bounds;
导入javafx.geometry.NodeOrientation;
导入javafx.application.application;
导入javafx.application.Platform;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.control.Label;
导入javafx.scene.control.Tab;
导入javafx.scene.control.TabPane;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共类TabDragTest2扩展了应用程序{
私有静态选项卡createTab(字符串标题){
Tab Tab=新选项卡();
tab.setGraphic(新标签(标题));
返回选项卡;
}
@凌驾
公共无效开始(阶段primaryStage){
TabPane TabPane=新建TabPane();
tabPane.setTabDragPolicy(tabPane.TabDragPolicy.REORDER);
tabPane.getTabs().add(createTab(“First”);
tabPane.getTabs().add(createTab(“第二”);
tabPane.getTabs().add(createTab(“第三”);
tabPane.getTabs().add(createTab(“第四”);
tabPane.getTabs().add(createTab(“第五”);
tabPane.getTabs().addListener((可观察到的o)->{
List tabs=newarraylist(tabPane.getTabs());
NodeOrientation orientation=tabPane.getEffectiveNodeOrientation();
布尔ltr=方向==节点方向。从左到右;
制表符排序((t1,t2)->{
节点title1=t1.getGraphic();
节点title2=t2.getGraphic();
边界标题1边界=
title1.localToScene(title1.getLayoutBounds());
边界标题2边界=
title2.localToScene(title2.getLayoutBounds());
if(tabPane.getSide().isHorizontal()){
如果(ltr){
返回Double.compare(
title1Bounds.getMinX(),title2Bounds.getMinX());
}否则{
返回Double.compare(
title2Bounds.getMaxX(),title1Bounds.getMaxX());
}
}否则{
返回Double.compare(
title1Bounds.getMinY(),title2Bounds.getMinY());
}
});
如果(!tabPane.getTabs().equals(tabs)){
Platform.runLater(()->tabPane.getTabs().setAll(tabs));
}
});
StackPane root=新的StackPane();
root.getChildren().add(选项卡窗格);
场景=新场景(根,300,250);
setTitle(“TabPane bug”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

可能错误报告包含解决方法?如果没有,你最好的选择是自定义皮肤/行为..有趣的是,我使用
tabPane.getTabs().addListener
在拖动之后打印出选项卡列表,我得到:
First,Second,Third,Fifth,Fourth
嗯,我不知道是否存在错误报告。。。我碰巧自己发现了这个问题,并提交了一个问题。这个问题已经在javafx回购协议中得到了修复。谢谢你的回答,它工作得非常完美。我正在做一个丑陋的反射黑客的事情,但这是一个更好的解决方案。