【问题标题】:Javafx detachable pane systemJavafx 可拆卸窗格系统
【发布时间】:2014-03-16 04:03:57
【问题描述】:

这是我喜欢的东西,我在一些不同的软件中看到过。我不知道它的来源或真正的名称,但这是 Visual Studio 中窗格系统的示例。

请注意我是如何轻松地将窗格附加到任何地方的。 Javafx 可以做到这一点吗?

【问题讨论】:

标签: java javafx


【解决方案1】:

我知道这个问题很老,但其他人可能有兴趣知道。我为 JavaFX 创建了一个轻量级的对接库,用于在 LGPL 许可下的专有和非专有用途。

https://github.com/RobertBColton/DockFX

【讨论】:

  • 我今天刚看了这个,不幸的是它不是开箱即用的。
  • 实际上已经有一个可用的版本。该项目使用 Apache Maven 构建版本,但我还保留了一个 jar 描述以从 Eclipse 导出。如果您需要更多帮助,请随时发布问题或在这里提问,我会尽力提供帮助。 github.com/RobertBColton/DockFX/releases
  • 嗨,git hub 上的页面提到了完整的文档,但我在那里看不到。我找错地方了吗?
  • 嗨 Rob,它实际上在源代码中,我使用将在 Eclipse 的代码完成中显示的格式。但是,我还没有在它上面运行文档处理器,所以我还没有上传它们,但那在我的待办事项列表上。完整文档意味着源代码已完整记录。很抱歉造成混乱。
  • 听起来不错,我假设您的意思是 Javadoc 格式?这个周末我会好好看看它。干杯
【解决方案2】:

JavaFX 8 没有内置的对接框架。

有一些第 3 方解决方案,例如 Drombler FX。我没有使用过它们中的任何一个。

创建一个简单的用于停靠和取消停靠面板的自制系统非常容易创建,但创建一个全面的系统则相当困难。以下代码改编自 zonski 对停靠框架讨论的回答,位于 Oracle JavaFX forum threads

import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.*;

public class SimpleDocking extends Application {
    public void start(final Stage stage) throws Exception {
        final SplitPane rootPane = new SplitPane();
        rootPane.setOrientation(Orientation.VERTICAL);

        final FlowPane dockedArea = new FlowPane();
        dockedArea.getChildren().add(new Label("Some docked content"));

        final FlowPane centerArea = new FlowPane();
        final Button undockButton = new Button("Undock");
        centerArea.getChildren().add(undockButton);

        rootPane.getItems().addAll(centerArea, dockedArea);

        stage.setScene(new Scene(rootPane, 300, 300));
        stage.show();

        final Dialog dialog = new Dialog(stage);
        undockButton.disableProperty().bind(dialog.showingProperty());
        undockButton.setOnAction(actionEvent -> {
            rootPane.getItems().remove(dockedArea);

            dialog.setOnHidden(windowEvent -> {
                rootPane.getItems().add(dockedArea);
            });
            dialog.setContent(dockedArea);
            dialog.show(stage);
        });
    }

    private class Dialog extends Popup {
        private BorderPane root;

        private Dialog(Window parent) {
            root = new BorderPane();
            root.setPrefSize(200, 200);
            root.setStyle("-fx-border-width: 1; -fx-border-color: gray");
            root.setTop(buildTitleBar());
            setX(parent.getX() + 50);
            setY(parent.getY() + 50);
            getContent().add(root);
        }

        public void setContent(Node content) {
            root.setCenter(content);
        }

        private Node buildTitleBar() {
            BorderPane pane = new BorderPane();
            pane.setStyle("-fx-background-color: burlywood; -fx-padding: 5");

            final Delta dragDelta = new Delta();
            pane.setOnMousePressed(mouseEvent -> {
                dragDelta.x = getX() - mouseEvent.getScreenX();
                dragDelta.y = getY() - mouseEvent.getScreenY();
            });
            pane.setOnMouseDragged(mouseEvent -> {
                setX(mouseEvent.getScreenX() + dragDelta.x);
                setY(mouseEvent.getScreenY() + dragDelta.y);
            });

            Label title = new Label("My Dialog");
            title.setStyle("-fx-text-fill: midnightblue;");
            pane.setLeft(title);

            Button closeButton = new Button("X");
            closeButton.setOnAction(actionEvent -> hide());
            pane.setRight(closeButton);

            return pane;
        }
    }

    private static class Delta {
        double x, y;
    }

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

如果您广泛需要这样一个框架,您可能需要查看NetBeans platform,这是一个基于 Swing 的框架,您可以在其中嵌入 JavaFX。

【讨论】:

    【解决方案3】:

    一个简单的JavaFX对接框架:

    https://github.com/andy-goryachev/FxDock

    public void start(Stage s) throws Exception
    {
        // plug in custom windows and dockable panes. 
        FxDockFramework.setGenerator(new DemoPanes());
    
        // load saved layout
        int ct = FxDockFramework.loadLayout();
        if(ct == 0)
        {
            // when no saved layout exists, open the first window
            DemoWindow.openBrowser("https://github.com/andy-goryachev/FxDock");
        }
    }
    

    【讨论】:

      【解决方案4】:

      正如previous answer 所说,JavaFX 没有对可停靠选项卡的内置支持。有一个OpenJDK issue 请求支持可拖动和可停靠选项卡。

      最近可能值得研究的第三方解决方案是 DockFX,在撰写本文时(2015 年 9 月)正在积极开发中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-16
        • 2018-05-09
        • 2015-04-29
        • 1970-01-01
        • 2022-10-22
        • 1970-01-01
        • 2012-10-10
        相关资源
        最近更新 更多