【问题标题】:Java GUI look and feel changesJava GUI 外观变化
【发布时间】:2010-11-13 00:58:06
【问题描述】:

我是编程新手,但我正准备编写 Java 程序。正如我正在计划的那样,我正在尝试为它找到合适的 GUI。我找到了带有 GUI 选项的 this 页面。我有两个问题:

  1. 这些只是插入到 Java GUI 构建器中吗?
  2. 在构建程序后更改 GUI 外观和感觉有多容易(或难)?

【问题讨论】:

    标签: java user-interface


    【解决方案1】:

    忽略选择外观 (LAF) 的优缺点,我将添加一些使用它们的经验...

    如果您使用第三方/cots 组件库(JIDE、SwingLabs/SwingX 等),您将遇到问题,因为 UI 类不会始终存在或与所有 LAF 保持同步。 JIDE 支持一些外部 LAF(Alloy 和 Synthetica)。一些 LAF 还提供对小部件的支持; Substance 支持一些 JIDE 和 SwingX。最终结果是一个部分蒙皮的应用程序。不漂亮。确保您的 LAF 支持您的所有组件。如果你是纯 Swing/AWT,没问题。

    鉴于此,我们使用 Alloy 来支持 JIDE,并考虑迁移到 Synthetica。我们很想使用 Substance,但它没有任何 JIDE 支持。

    【讨论】:

      【解决方案2】:

      根据 Uri 所说的,您可能希望坚持使用其中一种更为知名的外观和感觉。

      如果您使用 Swing,您可能需要考虑使用 Nimbus 外观和感觉...它包含在 Java 6u10 和更新版本中。 Nimbus 建立在 Java 5 和更新版本中包含的 Synth 框架之上。

      当然,如果最终用户使用的是较低版本,它将抛出 UnsupportedLookAndFeelException 并默认为 JVM 默认值(通常是 Metal/Ocean(跨平台)主题)。

      附带说明,如果您使用 Swing,则可以动态切换正在使用的外观。你只需要打电话

      // "lnfName" is the look and feel name.
      // "frame" is the window's JFrame.
      // A try/catch block is omitted here.
      UIManager.setLookAndFeel(lnfName);
      SwingUtilities.updateComponentTreeUI(frame);
      frame.pack();
      

      【讨论】:

      • 我不能以某种方式在安装程序中包含必要的库(或其他),以便用户在我开发它时看到我想要的外观吗?
      • 您可以在发行版中包含外观 .jar 文件,也可以使其成为类路径的一部分。然后用户就可以使用它了。
      • 在非标准外观设计的情况下是否包含 .jar 文件不是常见做法?否则为什么 R. Bemrose(或其他任何人)会担心 UnsupportedLookAndFeelException(s) 并且它默认为默认外观?还是我听不懂?
      • 当您在发行版中包含 jar 文件时,您会将其包含在存储库的文件夹中(通常不是强制性的)。然后您的程序调用库(在本例中为外观)。但是如果图书馆因为某种原因丢失了怎么办?在这种情况下,您将得到一个适当的例外。有些外观仅在某些平台上受支持。例如,您不能在 Windows 上使用某些 lnfs,在 MacOS 上使用其他 lnfs,在 Linux 上使用其他 lnfs。这就是你得到 UnsupportedLookAndFeelException 的时候。
      【解决方案3】:

      更改程序的外观和感觉很简单:

      UIManager.setLookAndFeel("fully qualified name of look and feel");
      

      在创建任何 GUI 创建代码之前。因此,您可以使用 GUI 构建器轻松创建所有 GUI,然后只需在程序开始时调用它即可。

      (请注意,某些外观和感觉,例如 Substance,在涉及线程问题时非常严格,因此您最好确保所有 GUI 代码都从事件调度线程运行。)

      作为一个建议,在我看来,两个非常好看(而且足够专业)的外观和感觉是 Substance 和 Nimbus,它们将随 JRE 的后续版本一起提供作为默认外观(至少这是计划),可以从 java.net 单独下载。

      因此,如果您选择 Nimbus,代码将是:

      UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
      

      Substance 的一个示例(Substance 有许多皮肤和主题,如果您想了解更多信息,请阅读他们网站上的文档):

      UIManager.setLookAndFeel(new org.jvnet.substance.skin.SubstanceBusinessBlackSteelLookAndFeel());
      

      另请注意,您可以像这样使用跨平台皮肤(金属):

      UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
      

      最后,如果你在 Windows 上,你可以使用这样的系统外观:

      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      

      【讨论】:

      • 请注意,如果 UIManager.setLookAndFeel 找不到所说的外观和感觉,它将抛出 UnsupportedLookAndFeelException。
      • 我需要使用 UIManager .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel") 让 Nimbus 工作。注意 com.sun.swing 包,而不是 javax.swing。
      • 这就是为什么你有一个新的 jre 版本,它在“非官方”com.sun 包中包含 Nimbus 外观。您不能依赖该软件包将来可用。如果您将 Nimbus 作为外部库下载,我给您的“javax.swing”路径是正确的。一旦 Nimbus 作为官方包包含在 jre 中,这也将成为官方名称。所以如果我是你,我会下载库并使用它,直到 Nimbus 作为默认 lnf 发布。
      • Savvas,你说,“还要注意,你可以使用跨平台皮肤(金属)......”。所有 Substance 皮肤都不是跨平台的吗?我怎么知道哪些不是?
      • 不,我的意思是 Java 附带的默认跨平台外观。如果您的代码允许用户在运行时更改外观(例如通过菜单),那么您将希望在其选项中包含默认外观。了解如何在运行时更改外观检查出答案 R.Bemrose 发布...
      【解决方案4】:

      一般来说,带有“观感”的第三方 GUI 库不是很受欢迎,这可能是它们质量的一个标志。

      标准 GUI 库本质上非常复杂,虽然它们支持一些外观和感觉调整,但这些调整通常很小或受到限制。

      我建议坚持使用 Swing 或 SWT,看看你能用它们的外观和感觉机制做什么,但不要指望奇迹。

      【讨论】:

      • 为什么它们不是很受欢迎?你看到我链接的那些了吗?他们看起来很不错。哪些质量问题会阻止人们使用它们?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      相关资源
      最近更新 更多