如果你想在Windows,Mac和Linux的Java代码桌面应用程序,将所有的代码是相同的?
而你只是改变GUI,使Windows应用程序将更像Windows等?
没有深入细节,它是如何工作的?
Java的卖点之一就是“一次编写,随处运行”(非常多)。
编译的字节码由Java虚拟机(JVM)执行。 JVM特定于运行的平台,但是任何具有JVM的平台都可以执行相同的字节码。 代码不必重新编译。
Swing是Java的跨平台GUI工具包。 您可以对其进行配置,使其具有在不同平台上看起来相同的GUI(它们在任何平台上看起来都不是本机的),或者可以告诉它在平台上使用最合适的外观正在执行。 所以,如果你在Windows上运行,它将看起来像一个Windows应用程序,如果你在OS X上运行它将看起来像一个本地的Mac应用程序。
您可以使用在不同平台上呈现相同UI的通用UI库。
有些使用自己的绘图/小部件构造,有些则抽象本地UI元素。
简单。
例如: Swing , AWT(有bug,请看下面)和QT(有注意事项)或SWT(人们似乎喜欢它)
至少在理论上,不仅代码是相同的,而且编译结果也是一样的(javac的输出,java编译器)。 安装在每个操作系统上的JVM负责将编译后的输出(称为“字节码”)转换为特定于平台的代码。 这意味着,大部分情况下,您可以例如在Linux上设计和构建您的Java应用程序,并在Windows或Mac上运行它。
代码本身将运行在具有Java虚拟机的任何平台上,因为所有JVM都将相同的确切字节码转换为特定于操作系统的机器代码。
至于外观,有一个方法( UIManager.getSystemLookAndFeelClassName()
),它允许你使你的界面使用与操作系统其余部分相匹配的GUI。 它在不同的操作系统上返回不同的结果。
如果您希望您的应用程序的用户界面在Windows上是“类似于Windows”的,则可以使用Mac上的“像Mac一样的”等等,来看看支撑Eclipse的SWT和RCP技术。 SWT尤其具有你想要的那种属性。
缺点(如果你想这样做的话)是你的应用程序将不能重用任何现有的基于AWT / Swing的库。 显然,你必须学习如何使用SWT堆栈。
如果您将应用程序分为三个不同的层次:
然后,你可以在不同的平台上使用相同的代码,但是它只能在其中一个上感觉到正确。 通常情况下,逻辑和表示不会改变,但如果Java应用程序模仿本机应用程序,交互将需要改变。
例如,OS X上的默认设置是在屏幕顶部显示菜单,Windows和Gnome上的默认设置是在窗口顶部显示菜单。 Gnome通常具有编辑下的应用程序属性,Windows下的Windows和OS X下的苹果符号(或者其他),所以菜单的细节不应该是相同的。 每个系统都有不同的布局和字体规则,其中只有一些是通过Swing本地模仿外观来实现的。
另一个选择是制作一个网络应用程序,它需要相当多的变化 – 你没有窗口,菜单和对话框,因为这样的按钮是由浏览器提供的,所以不是你的问题,用户不希望平台特定的行为从Web应用程序。
总之,是的,java一般是在任何地方编写一次。 这是“剥皮”,以适应平台。 如果您希望在手机上工作,则必须注意屏幕尺寸等硬件信息。
请注意,它也将运行在有线电视盒上 – 我正在研究这些东西。
即使与特定于平台的元素的交互也经常在相同的代码库中 – 所以如果你有一个库来检测窗口工具栏的存在,你可能会检测到并支持它,如果可用的话,但代码将不会检测到mac(或可能使用不同的库)。
但是,胜任的工程师不需要重新编译一个不同的平台。
人们曾经说过,Swing在不同的平台上不会产生本地结果。 显然这一切都改变了,Swing现在已经接近完美了。 去摇摆! 对于那些热爱Java(Groovy!和JRuby!)的人来说,这是个好消息。 这可能是不成熟的 ,但它是在工作中。
Java会很好的工作,你可以为VM编写和编译一次。 但是,如果您希望用户不必输入java -jar app.jar
,您将需要为每个平台打包应用程序。 在OSX上,您需要创建一个.app(非常简单),而且Windows和Linux也有很多启动选项。 另外Java WebStart是另一种可能性。
希望有所帮助。
编辑:让你的Swing在OSX上工作,似乎本机需要一些额外的步骤。 看到这里 。
我目前正在开发一个Web应用程序,我们经常在Windows上进行开发,但是在Linux上进行测试和生产。 在过去,我编写了GUI应用程序,在Windows和Linux上运行完全相同的代码。 我从来没有在Mac上完成Java,但我认为它也是在Windows和Linux之间的端口。
Java的美妙之处在于,90%的时间你甚至不需要考虑。 您只需编写能够在您正在开发的平台上运行的代码,并且它将以神奇的方式移植。
对我来说唯一常见的问题就是使用文件。 Java中有一些功能可以帮助,但是有时候你不得不利用这些功能。 就像,文件名是不同的:在Windows上,你有一个驱动器说明符(如“C:”),而在Linux上你不这样做,而在Windows上,你可以用反斜杠分开目录名,而在Linux上,你可以用正斜杠分隔它们。 有一些函数可以让你用通用的代码来处理这个问题,但是有些时候这是一个痛苦。 等等。
如果你想使用特定的字体,你不会在不同的平台上找到相同的字体。 但是你不能依赖在同一个操作系统的不同的盒子上找到特定的字体。 如果你想使用特定的字体,你真的需要检查盒子上可用的字体,让用户选择一个他们想要的或者让程序检查字体特征来选择一个。
我很难想出其他的东西,这对我来说是一个问题。 我敢肯定,如果你尝试,你可以拿出一些东西来打破这个或那个,但这些是我所记得的唯一的东西,而不会遇到麻烦。