3

我正在尝试在带有 scalafx 的 scala 上使用 javafx2。

我编写了一个简单的应用程序并添加了一个菜单和一个菜单项。当我单击菜单并将鼠标悬停在菜单项上时,有时它不会突出显示菜单,因此无法单击。为了检查我的代码是否做错了,我在 Windows 机器上运行完全相同的代码,它就可以工作。

我不明白为什么会这样。我想这通常与统一或 gnome 或 linux 有关。

有没有其他人遇到过同样的问题?有没有办法解决或克服它?

谢谢我提前

代码示例:只有菜单有奇怪的行为

package com.msp.ippokratis.ui
import scalafx.Includes._
import scalafx.collections.ObservableBuffer
import scalafx.collections.ObservableBuffer.observableBuffer2ObservableList
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.scene.Scene
import scalafx.scene.layout.{BorderPane,FlowPane,Priority}
import scalafx.scene.control.{MenuBar,MenuItem,Menu,Button,ComboBox}
import scalafx.event.ActionEvent
object Exampl extends JFXApp {
  stage = new PrimaryStage {
    scene = new Scene {
      content = new BorderPane {
        prefHeight = 400
        prefWidth = 400
        top = new MenuBar {
          menus = Seq(
            new Menu {
              text = "File"
              items = Seq(
                new MenuItem {
                  text = "Println"
                  onAction = (evt: ActionEvent) => {
                    println("Clicked Menu Item Println")
                  }
                })
            })
        }
        center = new FlowPane {
          hgrow  = Priority.ALWAYS
          content = Seq(
            new Button {
              text = "Sample Button"
              onAction = (evt: ActionEvent) => {
                println("Button Clicked")
              }
            },
            new ComboBox {
              val seq = List("Apple", "Orange", "Mango", "Banana").toSeq
              items = ObservableBuffer(seq.asInstanceOf[Seq[Nothing]])
              onAction = (evt: ActionEvent) => {
                println("Combobox")
              }
            })
        }
      }
    }
  }
}

编辑1:如果我单击菜单并使用键盘导航并按Enter,它也适用于Linux。

4

1 回答 1

2

过去,我记得遇到过两个影响 Linux 上基于 Java 的用户界面的问题:

加载了错误的共享对象

SWT 应用程序(例如 Eclipse 本身)显示了奇怪的鼠标交互。我认为只有在从 Ubuntu 存储库在系统范围内安装 SWT 共享库时才会出现这种情况。为了合理地确定不是这种情况,请尝试从您的主目录运行所有内容(JRE、JavaFX),并根据需要调整路径。如果您更加偏执,请删除任何 JRE 包和任何依赖它们的东西——特别是如果它的包名称中包含“jni”。

更有可能:禁用合成

尝试登录到合成无效的会话。例如,尝试安装“openbox”,注销,当您被提升登录时选择新的 openbox 会话。如果这对您有用,那么我可以寻找一种方法使 Java 与合成窗口管理器(如 Unity)更好地配合使用。

更新:也许您已经退回到 Java2D 管道

如果您的应用程序无法在 Linux 上使用 3D 硬件加速,它将转而使用基于 Java2D 的软件 3D 渲染。Java2D 被设计为使用称为 DGA 的 X11 扩展,主要供应商(例如:NVIDIA)不再支持该扩展。结果是大量的 CPU 烧焦、迟缓和无响应的 UI。尝试将sun.java2d.pmoffscreen设置为 false 以防止其干扰。

如果您使用的是 Java 7,请尝试设置-Dsun.java2d.xrender=true

这不是什么

根据您的描述,这似乎与 Scala 或 ScalaFX 无关。我希望任何渲染和/或可移植性问题都会出现在 JavaFX 或 JRE 本身的原生渲染位中。

于 2013-05-06T23:44:33.557 回答