在Tab [Javafx]中捕获MouseEnter事件

时间:2014-11-17 13:09:52

标签: javafx javafx-8

我希望能够在悬停在标签上时捕获MOUSEENTER事件。

我试图从选项卡的图形中做到这一点,这不是最佳解决方案,但它是一个带有此类事件的Node对象。

这就是我写的:

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

这个解决方案没有错误,但是Javafx会忽略它,无论如何都可以这样做?

更新:创建标签并添加其图形的方式如下所示。选项卡本身工作正常,图形显示正常。

     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 :(得分: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);
    }
}