为什么Java Swing在不同的系统上表现不同?

时间:2010-04-18 15:29:38

标签: java swing

我在计算机上写的一些转码在我同事的电脑,电脑和笔记本上都有所不同。

我想知道,我能在Swing应用程序中做些什么在每台计算机上表现相同吗?

我想确保我在计算机中测试的算法在客户端计算机中的工作方式相同。

E.g。 Problem to focus JTextField在我的Windows XP笔记本中工作正常,但在我的collague计算机上没有Windows XP,在我的Ubuntu工作计算机上都没有。

OBS。具体的JTextField问题不是这个问题的主题。

3 个答案:

答案 0 :(得分:4)

Swing应用程序在不同平台上的问题很常见,它们是由一个简单的事实引起的,即无论Java提供什么级别的抽象,它都必须在某些时候与底层操作系统的本机组件一起玩。事件虽然Swing只使用窗口(框架)并自己绘制所有内容 - 但是差异非常普遍。

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

在可插拔的外观和感觉方面,一切都变得异常多变。例如 - 使用金属或nimbus调整JSplitPane的速度非常快(如预期的那样),但如果使用GTK + plaf,一切都会变得地狱。这是一个更严重的(性能)问题 - 视觉问题(缺少边框,组件不适合容器等)没有尽头......尽管所有这些Swing仍然是多平台桌面应用程序的最佳选择之一。

答案 1 :(得分:2)

  

我想知道,我能做些什么   我的Swing应用程序表现得很好   每台电脑都一样吗?

我正在研究OS X / Windows / Linux上提供的复杂Java Swing应用程序,所以就像Bozhidar所回答的那样,这些问题都非常真实。

对于某些组件,如果你碰巧有一些UI设计/编程技巧,你可以简单地编写自己的组件:我意识到它可能不是一个有用的答案,但它可以工作。

例如,我们想要一个下拉列表“按类型查找”弹出式列表(就像您在Google的主搜索页面上开始搜索时出现的那个),它在Linux上看起来和工作方式相同Windows / OS X.在尝试了无数满是Swing idiosynchrasies的“解决方案”后,无法在任何地方工作(例如,猜测什么,焦点问题;)我们决定简单地从scractch编写我们自己的组件。

我们可以在OS X / Windows / Linux上拦截鼠标和键盘事件:我们可以在所有三个平台上编写一个不仅外观而且行为的组件

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

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

我意识到这可能不是你想听到的:我碰巧曾经在游戏用户界面和移动应用程序用户界面上工作过,而且我有一些图形技能所以我写“好看”并不“难” UI组件。

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

答案 2 :(得分:0)

  

我想确定一个算法   在我的电脑上测试过的   在我的客户端计算机中使用相同的方法

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

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

a)在Windows上你得到keyPressed,keyPressed,keyPressed,.... keyReleased。

b)在Unix上你得到了keypressed,keyReleased,keyPressed,keyReleased ......

顺便说一下,关于我的“textfield”帖子中的建议是否有效的评论会很好。正如我所提到的,我没有Ubuntu平台来测试它,所以我对结果感到好奇。