【问题标题】:Emulate This SWT Shell in Swing在 Swing 中模拟这个 SWT Shell
【发布时间】:2017-02-04 00:04:26
【问题描述】:

我一直在使用 SWT(Eclipse 使用 GUI lib),我想使用 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();
}

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

P.S 这个 Shell 周围的边框目前是我的 windows 配色方案的原生边框,我不想只创建一个 MatteBorder 并模拟颜色,我想使用 windows 的原生边框。

【问题讨论】:

  • Eclipse 也使用 SWT over Swing
  • 取消装饰 JDialog,然后创建自己的边框
  • @VinceEmigh,是的,这已经在 25 分钟前提出。你甚至读过答案吗?
  • 另一种方法是使用JWindow,可用于实现小部件。
  • 如果你想让它看起来像 SWT,你应该注意这个 SWT 对话框在不同平台上会有完全不同的边框(例如在 Mac 上它根本没有边框)。

标签: java swing swt border


【解决方案1】:

所以问题是:是否只能使用 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 中创建这样的框架(如您帖子中的屏幕截图),您只有一个选择 - 使用 JDialog/JFrame 并将 setUndecorated 设置为 true 或未装饰的 JWindow默认情况下并“画出你的方式”。为所有绘画操作提供的 Graphics2D 将允许您创建窗口的任何自定义装饰,甚至是屏幕截图上的装饰。

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

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

编辑: 由于 JDK 7 实际上可以创建工具窗口,您只需将窗口类型设置为Window.Type.UTILITY。虽然仍然不可能创建一个只有原生边框而没有任何标题栏的窗口。

【讨论】:

    【解决方案2】:

    使用undecorated JDialog。然后您可以将MatteBorder 添加到对话框的根窗格中。或者您始终可以实现自己的自定义边框来模拟 LAF 边框。

    【讨论】:

    • 这不是我想要做的。我想将 LAF 边框添加到它的外部,就像在常规窗口上一样。
    • @JonathanBeaudoin,你想要什么和你能做什么是有区别的。你要的不是支持。我提供了一个替代方案。
    【解决方案3】:

    在 Eclipse 上,我很确定它是使用 org.eclipse.swt.widgets.ShellSWT.Border 作为样式完成的。我想不出在 Swing 中做到这一点的方法。你可以自己写一个,但它不会有系统 LAF。

    如果这真的很重要,我建议改用 SWT,但这可能需要重新编写。否则,您可以使用带有 Swing components embedded 的 SWT Shell,但根据我的经验,这非常繁琐且难以调试。

    【讨论】:

    • 除了在 SWT 中嵌入 Swing 之外,您还可以尝试自己绘制它,像这样但没有标题和按钮:Frosted Glass on the Java™ Desktop。就像我说的,我不认为这是 Swing 开箱即用的事情。
    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2018-08-14
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多