gpt4 book ai didi

java - 自定义最小化按钮不调用 MouseLeave 事件

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:51:37 24 4
gpt4 key购买 nike

我有一个带有 StageStyle.TRANSPARENT 的简单舞台(没有默认按钮)。因此,我尝试创建自己的自定义按钮,每个按钮由 ImageView 表示,并激活下一个事件:setOnMouseEnteredsetOnMouseExited,当然还有 setOnMouseClicked.

问题出在最小化 按钮上。是一个像下面这样的简单实现

ImageView.setOnMouseClicked((MouseEvent event) -> {
stage.setIconified(true);
});

假设我的 ImageView 是一个White 矩形。在鼠标进入事件时,它会将颜色更改为黑色。在鼠标退出时,它会变回白色。

ImageView 被点击时,窗口将被最小化,到目前为止一切正常。

问题是当应用程序恢复(最大化)时,最小化自定义按钮卡在颜色黑色(代表按钮悬停的颜色),而不是白色(未聚焦时的默认颜色)。

附言似乎 onMouseClicked 处理程序中的 relocatesetImage 等所有内容都被 setInconified(true);

如有任何帮助,我们将不胜感激。

感谢您花时间阅读本文。

更新以澄清一点问题

The normal print-screen image (when it is not hovered)

The hover print-screen (when it is hovered)

如您所见,一切正常。在按下“-”按钮(最小化按钮)的那一刻,当应用程序恢复时,它会一直停留在悬停模式,直到鼠标光标再次悬停在按钮上(然后一切恢复正常)。遗憾的是, ImageView 上的 CSS 方法或事件监听器似乎都无法解决这个问题。

加载更新代码

这是一个简单的源文件,只有一个调用最小化的按钮

package application;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;


public class Main extends Application {
private Scene scene;
private Stage stage;

@Override
public void start(Stage stage) {
try {
this.stage = stage;
stage.initStyle(StageStyle.TRANSPARENT);
stage.setAlwaysOnTop(true);

stage.setFullScreen(true);
stage.setFullScreenExitHint("");

createScene(stage);

stage.setScene(scene);
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}

private void createScene(Stage stage) {
Pane layer = new Pane();
layer.setPickOnBounds(false);

scene = new Scene(layer, 800, 600);
scene.getStylesheets().add("application/application.css");

layer.getChildren().add(buildMinimizeImage());
}

private ImageView buildMinimizeImage() {
ImageView imv = new ImageView();
int width = 43 ;
int height = 36;

imv.setId("myImage");

imv.setFitWidth(width);
imv.setFitHeight(height);

imv.setOnMouseClicked((MouseEvent event) -> {
stage.setIconified(true);
});

imv.relocate(100, 100);

return imv;
}

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

application.css 也非常简单

#myImage
{
-fx-image: url("minimize.png");
}
#myImage:hover
{
-fx-image: url("minimizeIn.png");
}

问题在 Ubuntu 14.04 和 Windows 10 上重现。我不认为是操作系统问题

已解决

请找到随附的 Harry Mitchel 解决方案(再次感谢您)。这是完全可行的。

如果您想通过添加 setOnMousePressed 事件来修复上面的代码。

imv.setOnMousePressed((MouseEvent event) -> {
imv.setImage(image);
});

最佳答案

可以监听Stage类的maximized属性。在 changed() 方法中,设置 ImageView 的图像。

stage.maximizedProperty().addListener(new ChangeListener<Boolean>() {

@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
//Display the desired icon here.
}
});

这是一个自定义的最小化按钮。您提供两个图像和舞台作为参数。当鼠标不在按钮上时,它将显示在构造函数的第一个参数中引用的图像。当鼠标悬停在按钮上时,它将显示在构造函数的第二个参数中引用的图像。单击图像时,舞台将最小化。

import javafx.event.ActionEvent;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

public class MinimizeButton extends Button {
/**
*
* @param img the image when the button is NOT selected
* @param imgHover the image when button is selected
* @param stage the stage that will be minimized
*/
public MinimizeButton(Image img, Image imgHover, Stage stage) {
ImageView imgView = new ImageView(img);
this.setGraphic(imgView);
this.addEventHandler(MouseEvent.MOUSE_ENTERED, (MouseEvent e) -> {
imgView.setImage(imgHover);
});

this.addEventHandler(MouseEvent.MOUSE_EXITED, (MouseEvent e) -> {
imgView.setImage(img);
});

this.setOnAction((ActionEvent event) -> {
stage.setIconified(true);
imgView.setImage(img);
});
}
}

这是一个使用 MinimizeButton 类的示例应用。

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class CustomMinimize extends Application {
@Override
public void start(Stage stage) {
Image imgWhite = new Image(getClass().getResourceAsStream("imgWhite.png")); //your image here
Image imgGreen = new Image(getClass().getResourceAsStream("imgGreen.png")); //your hover image here
MinimizeButton btnMinimize = new MinimizeButton(imgWhite, imgGreen, stage);
btnMinimize.setStyle("-fx-background-color: black;");
btnMinimize.setPrefSize(50, 50);
Button btnExit = new Button("X");
btnExit.setMinSize(50,50);
btnExit.setOnAction((ActionEvent event) -> {
System.exit(0);
});
btnExit.setStyle("-fx-background-color: black;");
HBox hBox = new HBox();
hBox.setSpacing(2);
hBox.getChildren().addAll(btnMinimize, btnExit);

AnchorPane anchorPane = new AnchorPane();
anchorPane.getChildren().addAll(hBox);
AnchorPane.setRightAnchor(hBox, 5.0);
AnchorPane.setTopAnchor(hBox, 5.0);

Scene scene = new Scene(anchorPane);
stage.initStyle(StageStyle.TRANSPARENT);

stage.setScene(scene);
stage.show();
}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}

关于java - 自定义最小化按钮不调用 MouseLeave 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41454847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com