我试图在scalax的scala上使用javafx2。

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

我不明白为什么会这样。我猜想它通常与unity或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上运行。

最佳答案

回顾过去,我遇到了两个问题,这些问题影响了Linux上基于Java的用户界面:

共享对象错误

SWT应用程序(例如Eclipse本身)显示出奇怪的鼠标交互。我认为只有从Ubuntu系统信息库在系统范围内安装SWT共享库时,情况才如此。为了合理地确定不是这种情况,请尝试运行主目录中的所有内容(JRE,JavaFX),并根据需要调整路径。如果您特别偏执,请删除所有JRE软件包以及所有依赖于它们的内容-尤其是在软件包名称中包含“jni”的情况下。

更有可能:禁用合成

尝试登录到没有进行合成的 session 。例如,尝试安装“openbox”,然后注销,然后在提示您登录时选择新的openbox session 。如果这对您有用,那么我可以寻找一种方法来使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本身的本机渲染位中会出现任何渲染和/或可移植性问题。

09-12 05:15