【问题标题】:Why Java Swing behaves different on different systems?为什么 Java Swing 在不同的系统上表现不同?
【发布时间】:2020-09-18 10:30:09
【问题描述】:

我在我的计算机中编写的一些 swing 代码在我同事的计算机、我的 PC 和我的笔记本中的行为有所不同。

我想知道,我可以对我的 Swing 应用程序在每台计算机上的行为做些什么吗?

我想确保我在我的计算机上测试过的算法在我的客户端计算机上也能以同样的方式工作。

例如 Problem to focus JTextField 在我的装有 Windows XP 的笔记本电脑上运行良好,但在我同事的装有 Windows XP 的电脑上运行良好,在我的工作计算机上运行着 Ubuntu。

obs。具体的JTextField问题不是本题的主题。

【问题讨论】:

  • 你不知道Java的意思是“一次编写,到处测试”吗?
  • @cletus 我开始同意...
  • 不是具体问题?你的意思是这是一个咆哮/巨魔?
  • @Tom Hawtin - tackline 抱歉,你能重新表述一下吗?

标签: java swing


【解决方案1】:

Swing 应用程序在不同平台上的问题很常见,其原因很简单,即无论 Java 提供何种抽象级别,它都必须在某些时候与底层操作系统的本机组件打交道。事件虽然 Swing 仅使用窗口(框架)并自行绘制所有内容 - 差异非常普遍。

我开发了一个多平台 Swing 应用程序 - Windows 上的用户报告了 Linux 用户没有的各种问题,反之亦然。遗憾的是,此类问题没有灵丹妙药 - 广泛的测试和令人讨厌的修复是城里唯一的游戏。

在可插拔的外观和感觉方面,一切都变得异常错误和肮脏。例如 - 使用 metal 或 nimbus 调整 JSplitPane 的大小非常快(正如预期的那样),但如果你使用 GTK+ plaf,一切都会变得糟糕。这是一个更严重的(性能)问题 - 视觉问题(缺少边框、组件不适合容器等)没有尽头……尽管如此,Swing 仍然是多平台桌面应用程序的最佳选择之一。

【讨论】:

  • @Bozhidar Batsov:+1...喝过 Swing 凉粉但从未真正使用过复杂的多平台 Swing 应用程序的人不应该回答或评论这个问题:)
  • 它比这更糟糕。在我发布的示例中,swing 在 2 个 Windows 系统中表现不同。
【解决方案2】:

我想知道,有什么我可以做的吗 我的 Swing 应用程序的行为 每台电脑都一样吗?

我正在开发一个在 OS X / Windows / Linux 上发布的复杂 Java Swing 应用程序,所以就像 Bozhidar 回答的那样,这些问题都太真实了。

对于某些组件,如果您碰巧有一些 UI 设计/编程技能,您可以简单地编写自己的组件:我知道这可能不是一个有用的答案,但它确实有效。

例如,我们想要一个下拉式“输入时查找”弹出列表(就像您在 Google 的主搜索页面上开始搜索时出现的那样),它在 Linux 上的外观和工作方式相同/ Windows/OS X。在尝试了无数充满 Swing 特性的“解决方案”之后,这些“解决方案”并不适用于所有地方(比如,猜猜看,焦点问题;),我们决定简单地“从头开始”编写我们自己的组件。

我们可以在 OS X / Windows / Linux 上拦截鼠标和键盘事件:我们可以编写一个组件,不仅看起来而且行为在所有三个平台上都相同.

除了“find-as-you-type”之外,我们还编写了自己的 tooltip-popup 组件,一个双进度条(将进度条合二为一,以单条显示生产者/消费者风格的进度)和一个涉及多个“文本字段”的复杂组件,当我们尝试使用 Swing 来实现它时,它非常复杂且损坏(并且在不同平台上以不同方式损坏,例如奇怪的焦点问题或插入符号未显示等)。所以我们“弄脏了”并自己重写了整个组件。

结果?在 Java 可以为您提供有关鼠标和键盘事件的通知的所有平台上都以相同的方式工作...

我意识到这可能不是您想听到的:我碰巧在过去从事过游戏 UI 和移动应用程序 UI 的工作,而且我有一些图形技能,所以写出好看的东西对我来说并不“难” UI 组件。

遗憾的是,如果您希望某些 Java UI 组件在所有平台上的外观和行为都相同,那么它有时是您唯一的选择...

【讨论】:

  • +1 来自我。我感觉到你的痛苦——我自己写了很多自定义组件。而 Swing 的焦点遍历策略只能用“黑魔法”来形容……我其他“最喜欢”的多平台问题是剪贴板集成和系统托盘集成……
  • 最糟糕的是,我发布的示例表明,即使在 2 个 Windows 系统中,swing 应用程序的行为也会有所不同。
【解决方案3】:

我想确定我有一个算法 在我的电脑上测试过 在我的客户计算机上也是如此

“算法”应该可以正常工作。

当您依赖事件的顺序时会遇到问题,这在不同的平台上可能会有所不同。我知道的最常见的方法之一是按住一个键以便重复:

a) 在 Windows 上,您会得到 keyPressed、keyPressed、keyPressed、....keyReleased。

b) 在 Unix 上你会得到 keyPressed、keyReleased、keyPressed、keyReleased ...

顺便说一下,如果我在您的“文本字段”发布中的建议有效,请发表评论。正如我所提到的,我没有 Ubuntu 平台来测试它,所以我对结果很好奇。

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 2021-06-03
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多