2013-05-01 76 views
3

我想用scalafx在scala上使用javafx2。用鼠标点击并在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:如果我点击菜单,用键盘,按导航进入它只是在Linux上工作过。

+1

如果包含一些编译和展示奇怪行为的代码(如果可能的话,只是简化为相关问题),您可能会有更好的回应机会。 – huynhjl 2013-05-06 12:16:34

+0

尝试添加-Dsun.java2d。对于Java 6,pmoffscreen = false;对于Java 7,则为-Dsun.java2d.xrender = true。请参阅下面的更新回答。 – nadavwr 2013-05-07 10:35:50

回答

2

在过去,回想遇到该影响在Linux的基于Java的用户界面的两个问题:

错误共享对象被加载

SWT应用程序,如Eclipse本身,显示奇数鼠标交互。我认为只有当SWT共享库从Ubuntu存储库全系统安装时才是这种情况。为了合理确定情况并非如此,请尝试从主目录运行所有内容(JRE,JavaFX),根据需要调整路径。如果你偏执狂,请删除任何JRE软件包以及任何依赖它们的东西 - 特别是如果包名中含有'jni'的话。

更可能的是:禁用合成

尝试登录到会话其中合成未生效。例如,尝试安装'openbox',注销,当您被提升为登录时,选择新的openbox会话。如果这对你有用,那么我可以寻找一种方法来使Java更好地与合成窗口管理器(如Unity)一起播放。

UPDATE:如果你的应用程序无法使用Linux上的3D硬件加速也许你已经回落对Java2D的管道

,它会回落到基于Java2D的,而不是软件的3D渲染。 Java2D被设计为使用名为DGA的X11扩展,这已不再受主要供应商(例如NVIDIA)支持。结果是很多CPU焦躁,UI迟钝且无响应。尝试将sun.java2d.pmoffscreen设置为false以防止干扰。

如果您使用Java 7,请改为设置-Dsun.java2d.xrender=true

这不是

从你的描述是什么,这似乎是无关的斯卡拉或ScalaFX。我期望任何渲染和/或可移植性问题都会呈现在JavaFX或JRE本身的本地渲染位中。

+0

可悲的是,它也没有工作..如果你尝试上面的例子,你会看到它像悬停按钮,而不是菜单...但真的非常感谢您的详细解答.. – Iraklis 2013-05-09 16:04:22