我在工作中构建的 Java GUI 遇到了一个非常奇怪的问题。它太奇怪了,我甚至不知道从哪里开始寻求帮助!!
我们在异地拥有一个独立系统,由一台运行 XP 的 Windows PC 和一台 SuSE Linux 机器组成。我构建了一个 Java GUI,用于在 Linux 机器上运行一些 bash 脚本。由于用户不是 Linux 用户,因此 GUI 是从 Windows 机器启动的。构建 GUI 是为了替换向用户提供命令行提示以向主要处理脚本提供输入的脚本。
用户单击 Windows 桌面上的图标,运行 DOS 批处理 (*.bat) 文件。批处理文件使用 plink 和存储的 PuTTY 会话连接到 Linux 计算机并执行“java -jar XXX.jar”命令以启动 GUI。由于 Windows PC 上运行着 Cygwin/XX Server,因此 GUI 显示在 Windows PC 上。
好的。现在来说说怪异之处。如果我将 GUI 留在它最初弹出的位置,一切都很好。如果我移动 GUI,则下拉菜单(下拉组合框和菜单栏下拉菜单)不再正常工作。而且只有下拉菜单。其他一切都正常工作(按钮、文本字段……)。如果我将 GUI 移回其原始位置,一切都正常工作。如果我单击、按住并将鼠标光标拖到 GUI 最初弹出的位置(将 GUI 留在我移动它的位置),下拉菜单就可以正常工作。
起初我以为我初始化下拉菜单的方式有问题,但现在我不太确定了。我想知道 windows <-> putty <-> linux 或 Xwin 设置是否出了问题。
导致无法解决这个问题的原因是我无法在工作中复制此行为。不幸的是,我们没有异地系统的精确副本;我正在 XP 到 Debian Linux 机器上测试/构建此 GUI。
有人见过这样的事吗?有什么建议可以告诉我这里可能发生了什么吗?
十亿倍的感谢
账单
答案1
我认为通过 X 重定向运行 Java 不是一个好主意。
为什么不将 Java 程序放在 Windows PC 上并使用它来启动plink
和运行命令呢?如果您有 Java 程序的源代码,那么添加一个包装并替换Runtime.getRuntime().exec()
并放在plink
命令行前面的类应该很简单。然后,也许您可以对类进行一些修改,使其使用一个plink
会话来处理所有事情。然后,您还可以创建另一个具有相同接口但不添加的类,plink
以便您的 Java 程序可以在 Windows 和 Linux 上运行。
答案2
使用Java 1.7-Dsun.java2d.xrender=true
时,您可以使用远程 X Display。它使 Java 知道正在 X 中运行。请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/2d/flags.html
答案3
这可能与 Java 的图形系统 Java 2D 的硬件加速有关。
尝试通过添加 Java 进程的以下命令行选项来关闭任何硬件加速:
-Dsun.java2d.d3d=false
还有对 Java 2D 设置的完整参考这里。关闭 Direct 3D 将使 UI 变慢,但对于只有菜单而没有动画的简单 UI 来说,这应该没有问题。