Javafx可分离窗格系统
这是我在一些不同的软件中看到的东西。我不知道它从何而来,也不知道它的真正名称,但这里是VisualStudio中窗格系统的一个示例Javafx可分离窗格系统,java,javafx,Java,Javafx,这是我在一些不同的软件中看到的东西。我不知道它从何而来,也不知道它的真正名称,但这里是VisualStudio中窗格系统的一个示例 请注意,我可以轻松地将窗格附加到任何位置。Javafx是否可以实现这一点?JavaFX8没有内置的对接框架 有一些第三方解决方案,如。我一个都没用过 一个简单的自制系统来停靠和卸下面板是非常容易创建的,但是一个全面的系统将是相当困难的。下面的代码是根据zonski对停靠框架讨论的回答改编而成的 如果您对这样一个框架有广泛的需求,您可能需要研究,这是一个基于Sw
请注意,我可以轻松地将窗格附加到任何位置。Javafx是否可以实现这一点?JavaFX8没有内置的对接框架 有一些第三方解决方案,如。我一个都没用过 一个简单的自制系统来停靠和卸下面板是非常容易创建的,但是一个全面的系统将是相当困难的。下面的代码是根据zonski对停靠框架讨论的回答改编而成的 如果您对这样一个框架有广泛的需求,您可能需要研究,这是一个基于Swing的框架,您可以将JavaFX嵌入其中。正如所说,JavaFX没有内置的对可固定选项卡的支持。请求支持可拖动和可固定选项卡
最近一个值得研究的第三方解决方案是,在撰写本文时(2015年9月),该解决方案正在积极开发中。我承认这个问题很老,但其他人可能有兴趣知道。我为JavaFX创建了一个轻量级对接库,用于LGPL许可下的专有和非专有用途
一个简单的JavaFX对接框架:
我今天刚看了这个,不幸的是它不是开箱即用的。实际上已经有一个可用的版本了。该项目使用ApacheMaven构建发行版,但我还保留了一个jar描述以从Eclipse导出。如果您需要更多帮助,请随时发布问题或在此处询问,我将尽力提供帮助。嗨,GitHub上的页面提到了完整的文档,但我在那里看不到。我找错地方了吗?嗨,Rob,它实际上在源代码中,我使用的格式将显示在Eclipse的代码完成中。然而,我还没有在它上面运行文档处理器,所以我还没有上传它们,但这在我的待办事项列表中。完整文档意味着源代码被完整地文档化。很抱歉给您带来了困惑。听起来不错,我想您是指Javadoc格式?这个周末我要好好看看。为可行的解决方案干杯,并查看框架的回顾。
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);
}
}
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");
}
}