Javafx 2 使用鼠标拖动调整选项卡窗格大小时如何调整组件大小

Javafx 2 使用鼠标拖动调整选项卡窗格大小时如何调整组件大小,javafx-2,javafx,javafx-8,Javafx 2,Javafx,Javafx 8,我已经实现了非常简单的鼠标拖动位于中心的选项卡窗格。鼠标的大小调整是非常基本的,它的工作不是很好,但现在我可以拖动标签的边框,并增加大小 现在我发现了一个问题。当我调整位于中心的选项卡的大小时,位于中心旁边的组件不会像用户所期望的那样被推回并自动尖叫,它们被放置在我调整大小的组件后面。当我用鼠标拖动扩展主组件时,是否可以将所有组件设置为向后推?作为替代解决方案: 我发布了第一个早期的Access版本,这是一个基于OSGi和Maven的JavaFX新富客户端平台 它还附带了a的初始版本,这似乎是

我已经实现了非常简单的鼠标拖动位于中心的选项卡窗格。鼠标的大小调整是非常基本的,它的工作不是很好,但现在我可以拖动标签的边框,并增加大小


现在我发现了一个问题。当我调整位于中心的选项卡的大小时,位于中心旁边的组件不会像用户所期望的那样被推回并自动尖叫,它们被放置在我调整大小的组件后面。当我用鼠标拖动扩展主组件时,是否可以将所有组件设置为向后推?

作为替代解决方案:

我发布了第一个早期的Access版本,这是一个基于OSGi和Maven的JavaFX新富客户端平台

它还附带了a的初始版本,这似乎是您正在寻找的东西


您可以在此处阅读有关Drombler FX的更多信息:

作为替代解决方案:

我发布了第一个早期的Access版本,这是一个基于OSGi和Maven的JavaFX新富客户端平台

它还附带了a的初始版本,这似乎是您正在寻找的东西


您可以在此处阅读有关Drombler FX的更多信息:

与此处的其他人一样,我建议您使用
SplitPane
类来处理屏幕的拆分。下面是一个拆分窗格的示例(基于您的屏幕截图)。如果您不喜欢分隔条的显示,可以修改CSS以满足您的需要

import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.SplitPane;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;


public class FXSplitTabs extends Application{

    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("SplitTabs");
        stage.setWidth(700);
        stage.setHeight(500);

        //Setup Center and Right
        TabPaneWrapper wrapper = new TabPaneWrapper(Orientation.HORIZONTAL, .9);
        TabPane centerPane = new TabPane();
        centerPane.getTabs().addAll(generateTab("Tab 1"),generateTab("Tab 2"), generateTab("Tab 3"), generateTab("Tab N"));

        TabPane rightPane = new TabPane();
        rightPane.getTabs().addAll(generateTab("Tab 1"),generateTab("Tab 2"), generateTab("Tab 3"), generateTab("Tab N"));
        SplitPane.setResizableWithParent(rightPane, false);
        wrapper.addNodes(centerPane, rightPane);

        //Add bottom
        TabPane bottomPane = new TabPane();
        bottomPane.getTabs().addAll(generateTab("Tab 1"),generateTab("Tab 2"), generateTab("Tab 3"), generateTab("Tab N"));
        TabPaneWrapper wrapperBottom = new TabPaneWrapper(Orientation.VERTICAL, .7);
        wrapperBottom.addNodes(wrapper.getNode(), bottomPane);

        //Add left
        TabPane leftPane = new TabPane();
        leftPane.getTabs().addAll(generateTab("Tab 1"),generateTab("Tab 2"), generateTab("Tab 3"), generateTab("Tab N"));
        TabPaneWrapper wrapperleft = new TabPaneWrapper(Orientation.HORIZONTAL, .1);
        wrapperleft.addNodes(leftPane, wrapperBottom.getNode());

        Scene myScene = new Scene(wrapperleft.getNode());
        stage.setScene(myScene);
        stage.sizeToScene();
        stage.show();
    }

    public Tab generateTab(String name){
        Tab result = new Tab(name);
        BorderPane content = new BorderPane();
        TextArea text = new TextArea();
        content.setCenter(text);
        result.setContent(content);
        return result;
    }

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

    public static class TabPaneWrapper{
        SplitPane split;

        public TabPaneWrapper(Orientation o, double splitLocation){
            split = new SplitPane();

            //Change the CSS (uncomment if using an external css)
            //split.getStylesheets().add("test.css");

            split.setOrientation(o);
            split.setDividerPosition(0, splitLocation);
        }

        public void addNodes(final Node node1, final Node node2){
            //Add to the split pane
            split.getItems().addAll(node1, node2);
        }

        public Parent getNode(){
            return split;
        }
    }

}

如果您想使用CSS更改分隔符的外观,请取消上面CSS代码行的注释,在基本包中创建一个文件
test.CSS
,并插入CSS规范(下面是一个使分隔符透明的示例):


和这里的其他人一样,我建议使用
SplitPane
类来处理屏幕的拆分。下面是一个拆分窗格的示例(基于您的屏幕截图)。如果您不喜欢分隔条的显示,可以修改CSS以满足您的需要

import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.SplitPane;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;


public class FXSplitTabs extends Application{

    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("SplitTabs");
        stage.setWidth(700);
        stage.setHeight(500);

        //Setup Center and Right
        TabPaneWrapper wrapper = new TabPaneWrapper(Orientation.HORIZONTAL, .9);
        TabPane centerPane = new TabPane();
        centerPane.getTabs().addAll(generateTab("Tab 1"),generateTab("Tab 2"), generateTab("Tab 3"), generateTab("Tab N"));

        TabPane rightPane = new TabPane();
        rightPane.getTabs().addAll(generateTab("Tab 1"),generateTab("Tab 2"), generateTab("Tab 3"), generateTab("Tab N"));
        SplitPane.setResizableWithParent(rightPane, false);
        wrapper.addNodes(centerPane, rightPane);

        //Add bottom
        TabPane bottomPane = new TabPane();
        bottomPane.getTabs().addAll(generateTab("Tab 1"),generateTab("Tab 2"), generateTab("Tab 3"), generateTab("Tab N"));
        TabPaneWrapper wrapperBottom = new TabPaneWrapper(Orientation.VERTICAL, .7);
        wrapperBottom.addNodes(wrapper.getNode(), bottomPane);

        //Add left
        TabPane leftPane = new TabPane();
        leftPane.getTabs().addAll(generateTab("Tab 1"),generateTab("Tab 2"), generateTab("Tab 3"), generateTab("Tab N"));
        TabPaneWrapper wrapperleft = new TabPaneWrapper(Orientation.HORIZONTAL, .1);
        wrapperleft.addNodes(leftPane, wrapperBottom.getNode());

        Scene myScene = new Scene(wrapperleft.getNode());
        stage.setScene(myScene);
        stage.sizeToScene();
        stage.show();
    }

    public Tab generateTab(String name){
        Tab result = new Tab(name);
        BorderPane content = new BorderPane();
        TextArea text = new TextArea();
        content.setCenter(text);
        result.setContent(content);
        return result;
    }

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

    public static class TabPaneWrapper{
        SplitPane split;

        public TabPaneWrapper(Orientation o, double splitLocation){
            split = new SplitPane();

            //Change the CSS (uncomment if using an external css)
            //split.getStylesheets().add("test.css");

            split.setOrientation(o);
            split.setDividerPosition(0, splitLocation);
        }

        public void addNodes(final Node node1, final Node node2){
            //Add to the split pane
            split.getItems().addAll(node1, node2);
        }

        public Parent getNode(){
            return split;
        }
    }

}

如果您想使用CSS更改分隔符的外观,请取消上面CSS代码行的注释,在基本包中创建一个文件
test.CSS
,并插入CSS规范(下面是一个使分隔符透明的示例):



您是否使用SplitPane来分隔这些组件?您是否使用SplitPane来分隔这些组件?我想您是有经验的JavaFX开发人员。你能提出一些本机解决方案吗?嗯,我使用嵌套的拆分窗格来解决这个问题(正如@Shreyas Dave已经建议的)。有没有本机解决方案?在JavaFX的上下文中,“本机”是什么意思?也许可以使用setOnDragDetected实现来增加组件大小调整行为。我想你是有经验的JavaFX开发人员。你能提出一些本机解决方案吗?我使用嵌套的拆分窗格来解决这个问题(正如@Shreyas Dave已经建议的)。有本机解决方案吗?在JavaFX的上下文中,“本机”是什么意思?也许可以使用setOnDragDetected实现,它添加了组件大小调整行为。你的示例非常好,易于实现。但我还想问一个问题。如果我想在两个选项卡窗格之间切换位置,我该怎么做?在这个例子中,我只能实现基本的调整大小。我想你的意思是从“右”端取下所有标签,然后将它们切换到“左”端?您必须跟踪您的
拆分窗格
s和
添加
/
适当地从它们中删除
节点。是的,这是一个想法,但一个接一个。你能告诉我这个cam是如何实现的吗?我不知道你有什么问题。你有问题要问吗?您可以使用
onmousedrable
侦听器(使用setter)并在其中调用
startFullDrag()
。然后你会使用
setonmousedragreeleed
来听,看看它的发展方向。有没有什么例子可以让我看看如何实现它?你的例子非常好,而且很容易实现。但我还想问一个问题。如果我想在两个选项卡窗格之间切换位置,我该怎么做?在这个例子中,我只能实现基本的调整大小。我想你的意思是从“右”端取下所有标签,然后将它们切换到“左”端?您必须跟踪您的
拆分窗格
s和
添加
/
适当地从它们中删除
节点。是的,这是一个想法,但一个接一个。你能告诉我这个cam是如何实现的吗?我不知道你有什么问题。你有问题要问吗?您可以使用
onmousedrable
侦听器(使用setter)并在其中调用
startFullDrag()
。然后,您可以使用
setonmousedragreeled
进行收听,以了解它的发展方向。是否有任何示例可以让我了解如何实现它?