3

是否可以在不修改实际环境中的程序的情况下更改 Java 外观?

我知道理论上答案是肯定的。我还创建了演示应用程序,并在运行时更改了外观和感觉,并且效果很好。但是当我创建一个带有很多控件的真实应用程序时,外观变化并没有真正起作用:

  • 不同的外观有不同的错误(或奇怪的功能)。例如,其中一些为 JTextField 和 JFormattedTextField 创建相同的样式,其中一些使用不同的样式。这种变化对用户来说可能很烦人。
  • 控件大小不一样(使用不同的字体,不同的边框),所以有时候改变后的窗口看起来很难看。
  • 键盘快捷键也可以不同。
  • ...

在外观更改后的应用程序中(实际上,我尝试使用具有不同皮肤的相同外观而不是更改外观)我总是必须修改应用程序。不是很大的修改,但是很多小的修改使得外观和感觉的改变变得困难。

我只是对我尝试的外观(目前使用skinlf)非常不走运,还是外观变化不像小型演示应用程序那样容易?

更新:我正在使用 Swing 并且现在无法更改为其他 GUI 库。

UPDATE2:在我看来,这个问题并不清楚。我确实知道如何改变外观。我的问题是:是否有可能创建一个真正的应用程序,其中更改外观(或外观的皮肤)是一件容易的事?目前,如果我更改外观,仅更改 2 或 3 行是不够的,我必须审查整个应用程序并修复相当多由外观更改引起的问题。dhiller 建议用更好的外观替换 skinlf。你能告诉我皮肤替换效果更好的可换肤外观吗?

4

5 回答 5

2

是的,有不同的方法可以在不修改应用程序代码的情况下以某种外观启动您的应用程序。一种简单的方法是在应用程序启动时设置系统属性。例如,如果您有一个 shell 脚本或批处理文件来启动您的应用程序,您只需将命令从

java -jar yourapp.jar

java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel -jar yourapp.jar

-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel 将使用 GTKLookAndFeel 设置默认外观。

还有一种方法可以使用 Java 安装的 swing.properties 文件。有关更多详细信息,请查看

于 2008-11-18T11:02:06.880 回答
1

一般来说,IMO 使用系统外观和感觉是一个好主意,以避免在用户已经习惯了平台外观时引入新外观来让用户感到困惑。平台外观可以通过以下代码实现。

  UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );

无论如何,请参阅Change the Look and Feel After Startup (java tutorial),这可能会对您有所帮助。

顺便说一句:也许您使用了错误的布局管理器?

于 2008-11-18T11:39:56.680 回答
1

您是否尝试过在 UIManager 上设置外观?只是在开玩笑。但是,说真的,如果您更改外观和感觉并且应用程序看起来不正确,那是因为您没有以正确的方式使用 LayoutManagers。最容易理解的示例是使用空布局管理器。这种方法不会跨平台(极端示例)。作为一种开发技术,您应该使用各种外观和感觉进行所有 Swing 概念测试。否则你会很想在你的应用程序中“让事情正常运行”,这不是重点。真正了解布局可能是一项艰巨的工作。

也就是说,像键盘快捷键这样的东西总是需要特殊处理。Mac 上的菜单需要特殊处理。等等......然后是应用程序打包。

所以,是的,Java 在小型桌面演示中非常出色,并且需要努力才能使真正的应用程序完美。

于 2010-01-15T23:52:23.893 回答
0

外观应该改变字体和行为,这就是外观系统的目的:它应该表现得像本机操作系统,不同的操作系统有不同的显示方式。我必须承认,“Java”的外观和感觉(称为金属或其他东西)通常比许多标准操作系统版本更漂亮(自从我上次使用 Java 以来,这可能已经改变了几年)。我建议您默认使用操作系统的外观,因为如果打开文件菜单的行为与其他程序中的行为不同(不幸的是,Windows 用户习惯于不一致的 gui,但 Mac 用户希望所有程序举止得体)。

于 2008-11-18T10:44:07.743 回答
0

如果您的最终目标是每个目标操作系统的本机外观,您可以查看SWT。这将提供操作系统原生小部件,这些小部件将随着操作系统的外观和感觉而变化。

这样,用户不需要更改您的应用程序的选项,他们需要做的就是修改他们的操作系统主题,这些更改将自动传播到您的应用程序。

于 2008-11-18T14:56:19.030 回答