【问题标题】:JavaFX Show a pane on Mouse hoverJavaFX 在鼠标悬停时显示一个窗格
【发布时间】:2019-05-18 19:10:24
【问题描述】:

我有一个JavaFX 应用程序,我想在mousehover 事件上显示pane Button

我期望的输出类似于 Windows 任务栏预览样式,其中悬停 TaskBar 图标时,预览窗格会显示在顶部。 (如下所示)

如何使用 JavaFX 实现这种效果。

【问题讨论】:

  • 也许是检查过的方法之一here
  • @trashgod 我遵循了上述方法,得到了我的预期..

标签: java javafx


【解决方案1】:

正如@Przemek 提到的,有很多方法可以满足这个要求。除了@Przemek 实现之外,另一种方法是使用 Popup 控件。

下面是@Przemek 修改后的代码,带有 Popup 实现。

import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.stage.Popup;
import javafx.stage.Stage;

public class StickyNotesApp extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {
        StackPane notedPane = new StackPane();
        notedPane.setPrefSize(20, 20);
        notedPane.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
        notedPane.setStyle("-fx-background-color: purple;");

        StackPane rootPane = new StackPane(notedPane);
        rootPane.setPrefSize(400, 400);
        StackPane.setAlignment(notedPane, Pos.BOTTOM_CENTER);

        stage.setScene(new Scene(rootPane));
        stage.show();

        StackPane stickyNotesPane = new StackPane();
        stickyNotesPane.setPrefSize(200, 200);
        stickyNotesPane.setStyle("-fx-background-color: yellow;");

        Popup popup = new Popup();
        popup.getContent().add(stickyNotesPane);

        notedPane.hoverProperty().addListener((obs, oldVal, newValue) -> {
            if (newValue) {
                Bounds bnds = notedPane.localToScreen(notedPane.getLayoutBounds());
                double x = bnds.getMinX() - (stickyNotesPane.getWidth() / 2) + (notedPane.getWidth() / 2);
                double y = bnds.getMinY() - stickyNotesPane.getHeight();
                popup.show(notedPane, x, y);
            } else {
                popup.hide();
            }
        });
    }
}

【讨论】:

    【解决方案2】:

    代码非常原始,但获得了您要求的核心功能(当然,它可以通过多种方式实现,具体取决于需求,我刚刚发布了对我来说实施速度最快的解决方案)

    import javafx.application.Application;
    import javafx.beans.value.ChangeListener;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.layout.Region;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    import javafx.stage.StageStyle;
    
    public class StickyNotesApp extends Application {
    
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override
        public void start(Stage stage) throws Exception {
            StackPane notedPane = new StackPane();
            notedPane.setPrefSize(20, 20);
            notedPane.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
            notedPane.setStyle("-fx-background-color: purple;");
    
            StackPane rootPane = new StackPane(notedPane);
            rootPane.setPrefSize(400, 400);
            StackPane.setAlignment(notedPane, Pos.BOTTOM_CENTER);
    
            stage.setScene(new Scene(rootPane));
            stage.show();
    
            Stage stickyNotesStage = new Stage();
            stickyNotesStage.initOwner(stage);
            stickyNotesStage.initStyle(StageStyle.UNDECORATED);
            StackPane stickyNotesPane = new StackPane();
            stickyNotesPane.setPrefSize(200, 200);
            stickyNotesPane.setStyle("-fx-background-color: yellow;");
            stickyNotesStage.setScene(new Scene(stickyNotesPane));
    
    
            notedPane.hoverProperty().addListener((ChangeListener<Boolean>) (observable, oldValue, newValue) -> {
                if (newValue) {
                    stickyNotesStage.show();
                } else {
                    stickyNotesStage.hide();
                }
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 2012-09-21
      • 1970-01-01
      相关资源
      最近更新 更多