鼠标单击并在javafx2上悬停时出现奇怪的行为

时间:2013-05-01 12:00:21

标签: scala javafx scalafx

我正在尝试使用scalafx在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:如果我点击菜单并使用键盘导航并按下输入它也适用于Linux。

1 个答案:

答案 0 :(得分:2)

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

正在加载错误的共享对象

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

更有可能:禁用合成

尝试登录合成无效的会话。例如,尝试安装“openbox”,注销,当您被提升为登录时,请选择新的openbox会话。如果这适合你,那么我可以通过合成窗口管理器(例如Unity)来寻找一种方法让Java更好地发挥作用。

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

如果您的应用程序无法在Linux上使用3D硬件加速,那么它将回归到基于Java2D的软件3D渲染。 Java2D被设计为使用名为DGA的X11扩展,主要供应商不再支持它(例如:NVIDIA)。结果是CPU灼热,缓慢且无响应的用户界面。尝试将sun.java2d.pmoffscreen设置为false以防止干扰。

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

这不是

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