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