在Swing中模拟此SWT Shell

Jon*_*oin 5 java swing swt border

我一直在体验SWT(GUI lib Eclipse使用),我想使用Swing创建以下内容.

在此输入图像描述

之前的屏幕截图是使用SWT通过以下代码完成的

public static void main(String[] args) {
    Display display = new Display();
    final Shell shell = new Shell(display, SWT.RESIZE);
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}
Run Code Online (Sandbox Code Playgroud)

我想知道,我怎么可能在Swing中模仿这个?

PS这个Shell周围的边框目前是我的Windows配色方案的原生边框,我不想创建一个MatteBorder并模拟颜色,我想使用原生边框的窗口.

Mik*_*rin 3

那么问题是:是否只能使用 Swing 创建带有边框的本机样式窗口?
简而言之:不可以。不幸的是,使用 Swing 不可能做到这一点。
另外:同样的“否”也适用于也可以使用 SWT 创建的工具窗口。

现在让我解释一下原因。

Swing 使用纯 Java 编写的渲染来绘制应用程序中的任何组件和自定义装饰。Swing 中的窗口装饰是一个有点不同的主题 - 默认情况下 JFrame 和 JDialog 是使用本机样式装饰的 - 基本上当窗口实例是从 Java 应用程序在系统中创建时 - 该窗口被要求为框架或对话框具有默认装饰(加上一些其他可能的选项)。之后,该窗口用于在其上呈现 Swing 组件。但是 Swing 代码无法真正控制系统提供的装饰,它只能打开/关闭它并配置其中的一些选项。不幸的是,您正在寻找的选项不存在 - 很可能没有实现为不是很受欢迎的选项。

尽管 Swing 允许通过自定义 L&F(外观和感觉)自定义组件/窗口样式。支持自定义窗口装饰的 L&F 只是提供了自己的方式来绘制和控制窗口装饰。如果安装了这样的 L&F - Swing 默认情况下使用未装饰的框架/对话框,并简单地要求 L&F 进行装饰。任何人都可以编写自己的 L&F,这意味着任何人都可以创建自定义装饰。

因此,正如 @camickr 之前提到的,如果您想在 Swing 中创建这样的框架(如您帖子中的屏幕截图所示),您只有一个选择 - 使用设置为setUndecoratedtrue 的 JDialog/JFrame 或默认情况下未装饰的 JWindow 并“绘制您的方式通过”。为所有绘画操作提供的 Graphics2D 将允许您创建窗口的任何自定义装饰,甚至是屏幕截图上的装饰。

我不会说谎 - 创建自定义窗口装饰是相当困难的 - 它需要大量的 Swing 知识和大量的书面代码,而不仅仅是绘制代码。所以我真的怀疑你会选择这个选项,除非你对 UI 创建充满热情。

最后 - 您必须在 SWT 和 Swing(甚至 JavaFX)之间进行选择,因为这些 UI 框架中的每一个都提供完全不同的功能和选项集。橱窗装饰只是冰山一角。

编辑: 从 JDK 7 开始,实际上可以创建工具窗口,您所需要做的就是将窗口类型设置为Window.Type.UTILITY. 尽管仍然不可能创建一个仅具有本机边框而没有任何标题栏的窗口。