2014-11-17 73 views
0

我希望能夠在鼠標懸停在選項卡上時捕獲MOUSEENTER事件。在一個選項卡中捕獲MouseEnter事件[Javafx]

我試圖從選項卡的圖形,這不是最佳的解決方案,但它是一個具有此類事件的節點對象。

這是我寫的:

tab.getGraphic().setOnMouseEntered((MouseEvent event) -> { 
      System.out.println("..... mouse entered"); 
      //... 
     }); 

這種解決方案並不錯誤,但被忽略的JavaFX,沒有辦法做到這一點?

UPDATE:創建選項卡並添加其圖形的方式如下所示。該選項卡本身工作正常,圖形顯示正常。

 Tab tab = addChatTab(root, strName, strID, chat, false); 
    // setup tab graphic 
    switch (win.type) { 
     case wtChat: 
      if (chat !=null) 
       if (chat.isPublic()) { 
        tab.setGraphic(new ImageView(Main.me.imgTabPublic)); 

       } else { 
        if (chat.isDCC()) 
         tab.setGraphic(new ImageView(Main.me.imgTabDCC)); 
        else tab.setGraphic(new ImageView(Main.me.imgTabPrivate)); 
      } 

      break; 
     case wtWall: 
      tab.setGraphic(new ImageView(Main.me.imgTabWall)); 
      break; 
     case wtMessage: 
      tab.setGraphic(new ImageView(Main.me.imgTabMessage)); 
      break; 
    } 
+1

您是否在選項卡上設置了圖形? –

+0

是的,當然,如果你不嘗試設置偶數或添加一個偵聽器,你會得到一個空指針異常。 – betaman

+1

你能展示你如何設置棕褐色和它的圖形?這對我來說工作得很好。 –

回答

1

如果在圖形上設置了鼠標處理程序,則只有在鼠標與圖形本身交互時纔會調用該處理程序。在此示例中,第一個選項卡包含文本和圖形集,因此當鼠標移動到文本上時,不會調用鼠標處理程序。第二個選項卡不設置文本,但使用標籤作爲圖形,標籤包含文本。在這種情況下,當鼠標移動到文本或圖像上時,會調用鼠標處理程序。

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.control.Tab; 
import javafx.scene.control.TabPane; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class TabPaneHoverTest extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     // hover only applies on graphic: 
     Tab tab1 = new Tab("Tab 1"); 
     tab1.setGraphic(new Rectangle(16, 16, Color.RED)); 

     // Tab only uses graphic (no text), 
     // so hover appears to apply to whole tab: 
     Tab tab2 = new Tab(); 
     Label tab2Graphic = new Label("Tab 2", new Rectangle(16, 16, Color.GREEN)); 
     tab2.setGraphic(tab2Graphic); 

     tab1.getGraphic().setOnMouseEntered(e -> System.out.println("Hover on tab 1")); 
     tab2.getGraphic().setOnMouseEntered(e -> System.out.println("Hover on tab 2")); 

     BorderPane root = new BorderPane(new TabPane(tab1, tab2)); 
     Scene scene = new Scene(root, 600, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

謝謝James_D,你的例子有效。我修改它以更改ImageView的標籤圖形......並在我的情況下,它停止工作。 我想解決的辦法是讓圖形成爲標籤並將Imageview作爲其圖形。不應該是必要的,但它是可行的。 – betaman

相關問題