1

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

在此处输入图像描述

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

4

2 回答 2

6

像这里的其他人一样,我建议使用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 规范(这是一个将分隔线变为透明的示例):

.split-pane-divider {
   -fx-border-color: transparent;
   -fx-background-color: transparent;
}
于 2013-07-12T15:48:13.047 回答
3

作为替代解决方案:

我已经发布了Drombler FX的第一个早期访问版本,这是一个基于 OSGi 和 Maven 的 JavaFX 新富客户端平台。

它还附带了一个初始版本的对接框架,这似乎是您正在寻找的东西。

您可以在此处阅读有关 Drombler FX 的更多信息:http: //puces-blog.blogspot.ch/2012/12/drombler-fx-building-modular-javafx.html

于 2013-07-01T08:18:25.193 回答