2013-05-01 73 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