当前位置: 首页 > article >正文

悬停以及点击切换图片

为了实现悬停切换图片的功能,我们可以为每个按钮添加鼠标悬停事件监听器。以下是详细步骤和代码:

  1. 首先在控制器类中添加初始化方法,并添加事件监听器:
package com.example.demo6;import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;public class LoginController {// 原有的FXML注入字段保持不变...@FXMLpublic void initialize() {// 初始化所有悬停图片为不可见setHoverImagesVisible(false);// 为所有按钮绑定悬停效果bindHoverEffects();}private void setHoverImagesVisible(boolean visible) {friend2.setVisible(visible);message2.setVisible(visible);info2.setVisible(visible);avatar2.setVisible(visible);memes2.setVisible(visible);file2.setVisible(visible);photo2.setVisible(visible);voice2.setVisible(visible);}private void bindHoverEffects() {setupHoverEffect(friend, friend1, friend2);setupHoverEffect(message, message1, message2);setupHoverEffect(info, info1, info2);setupHoverEffect(avatar, avatar1, avatar2);setupHoverEffect(memes, memes1, memes2);setupHoverEffect(file, file1, file2);setupHoverEffect(photo, photo1, photo2);setupHoverEffect(voice, voice1, voice2);}private void setupHoverEffect(Button button, ImageView normal, ImageView hover) {button.setOnMouseEntered(event -> {normal.setVisible(false);hover.setVisible(true);});button.setOnMouseExited(event -> {normal.setVisible(true);hover.setVisible(false);});}// 原有的空方法可以保留或移除(如果不需要点击事件)@FXMLvoid exchange(ActionEvent event) {// 如果需要保留点击功能可以在这里添加代码}// 其他exchange方法同理...
}
  1. 确保FXML中成对的ImageView初始状态正确(默认显示第一个图片),或者在initialize方法中设置初始可见性。
  2. 如果需要保留点击切换功能,可以在原有exchange方法中添加切换逻辑:
@FXML
void exchange(ActionEvent event) {boolean visible = friend2.isVisible();friend1.setVisible(!visible);friend2.setVisible(visible);
}

实现原理:

  1. 使用setOnMouseEntered和setOnMouseExited事件监听器
  2. 通过控制ImageView的visible属性切换图片显示
  3. 初始化时将所有悬停状态图片设为不可见
  4. 使用通用方法setupHoverEffect为所有按钮统一添加效果

注意事项:

  1. 确保图片资源路径正确
  2. 检查FXML中ImageView的叠加顺序(后定义的会在上层)
  3. 如果不需要点击事件,可以移除对应的onAction属性和控制器方法
  4. 所有按钮的style都设置了transparent背景以保证视觉效果

这个实现会在鼠标进入按钮区域时显示悬停图片,离开时恢复默认图片。如果需要添加点击效果,可以在原有exchange方法中补充切换逻辑。

让我们分步实现点击保持状态的功能,同时保留其他按钮的悬停效果。以下是完整实现方案:

package com.example.demo6;import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.image.ImageView;public class LoginController {// 保持原有FXML注入字段...@FXML private Button friend;@FXML private ImageView friend1;@FXML private ImageView friend2;@FXML private Button avatar;@FXML private ImageView avatar1;@FXML private ImageView avatar2;@FXML private Button info;@FXML private ImageView info1;@FXML private ImageView info2;@FXML private Button message;@FXML private ImageView message1;@FXML private ImageView message2;private Button activeButton; // 当前激活的按钮@FXMLpublic void initialize() {// 初始化所有悬停图片为不可见setInitialStates();// 绑定悬停效果(所有按钮)bindHoverEffects();// 绑定点击效果(特定按钮)bindClickEffects();}private void setInitialStates() {// 设置初始可见性(确保FXML中默认显示1号图片)friend2.setVisible(false);avatar2.setVisible(false);info2.setVisible(false);message2.setVisible(false);// 其他按钮的初始化(如有需要)// memes2.setVisible(false);// file2.setVisible(false);// ...}private void bindHoverEffects() {// 所有按钮的悬停效果setupHoverEffect(friend, friend1, friend2);setupHoverEffect(avatar, avatar1, avatar2);setupHoverEffect(info, info1, info2);setupHoverEffect(message, message1, message2);// 其他按钮的悬停效果// setupHoverEffect(memes, memes1, memes2);// setupHoverEffect(file, file1, file2);// ...}private void bindClickEffects() {// 特定按钮的点击效果setupClickEffect(friend, friend1, friend2);setupClickEffect(avatar, avatar1, avatar2);setupClickEffect(info, info1, info2);setupClickEffect(message, message1, message2);}// 悬停效果处理(通用方法)private void setupHoverEffect(Button btn, ImageView normal, ImageView hover) {btn.setOnMouseEntered(e -> {if (btn != activeButton) { // 非激活状态才响应悬停normal.setVisible(false);hover.setVisible(true);}});btn.setOnMouseExited(e -> {if (btn != activeButton) { // 非激活状态才恢复normal.setVisible(true);hover.setVisible(false);}});}// 点击效果处理(特定按钮)private void setupClickEffect(Button btn, ImageView normal, ImageView active) {btn.setOnAction(e -> {if (btn == activeButton) {// 点击已激活的按钮:取消激活normal.setVisible(true);active.setVisible(false);activeButton = null;} else {// 取消之前的激活状态if (activeButton != null) {resetPreviousActive();}// 设置新的激活状态normal.setVisible(false);active.setVisible(true);activeButton = btn;}});}private void resetPreviousActive() {// 根据按钮类型重置状态if (activeButton == friend) {friend1.setVisible(true);friend2.setVisible(false);} else if (activeButton == avatar) {avatar1.setVisible(true);avatar2.setVisible(false);} else if (activeButton == info) {info1.setVisible(true);info2.setVisible(false);} else if (activeButton == message) {message1.setVisible(true);message2.setVisible(false);}}
}

实现说明:

  1. 状态管理机制
    • 使用 activeButton 变量跟踪当前激活的按钮• 点击时检查是否重复点击同一按钮,实现状态切换
  2. 悬停与激活状态的关系
// 在悬停处理中增加状态判断
if (btn != activeButton) {// 只有非激活按钮才会响应悬停
}
  1. 点击逻辑流程
点击事件
是否点击已激活按钮?
取消激活状态
取消之前的激活
设置新激活状态

FXML 需要调整的部分:

<!-- 移除所有按钮的 onAction 属性 -->
<Button fx:id="friend" ... />  <!-- 原 onAction="#exchange" 需要删除 -->
<Button fx:id="avatar" ... />
<Button fx:id="info" ... />
<Button fx:id="message" ... />

验证步骤:

  1. 点击 “好友” 按钮 → friend2 保持显示
  2. 悬停 “消息” 按钮 → 显示 message2(此时消息未激活)
  3. 点击 “消息” 按钮 → friend2 消失,message2 保持显示
  4. 再次点击 “消息” → message2 消失,恢复 message1

常见问题处理:

现象可能原因解决方案
点击无反应FXML 中保留 onAction 属性删除所有按钮的 onAction 属性
图片显示叠加ImageView 层级问题确保 FXML 中 2 号图片定义在 1 号之后
激活状态无法取消activeButton 未置空检查 resetPreviousActive 逻辑
悬停效果干扰激活状态未正确判断 activeButton确认悬停处理中的状态判断逻辑

这个方案实现了:
• 点击特定按钮保持激活状态

• 同一时间只能有一个激活状态

• 激活按钮不受悬停效果影响

• 其他按钮保留原有悬停功能

• 可通过二次点击取消激活状态

如果需要调整激活状态的视觉效果,可以修改对应图片的可见性逻辑。如果还需要其他按钮的点击效果,可以通过相同模式扩展 setupClickEffect 方法。

package com.example.demo6;import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;public class LoginController {public ImageView qq2;@FXMLprivate Button avatar;@FXMLprivate ImageView avatar1;@FXMLprivate ImageView avatar2;@FXMLprivate Button file;@FXMLprivate ImageView file1;@FXMLprivate ImageView file2;@FXMLprivate Button friend;@FXMLprivate ImageView friend1;@FXMLprivate ImageView friend2;@FXMLprivate Button info;@FXMLprivate ImageView info1;@FXMLprivate ImageView info2;@FXMLprivate Button memes;@FXMLprivate ImageView memes1;@FXMLprivate ImageView memes2;@FXMLprivate Button message;@FXMLprivate ImageView message1;@FXMLprivate ImageView message2;@FXMLprivate Button photo;@FXMLprivate ImageView photo1;@FXMLprivate ImageView photo2;@FXMLprivate ListView<?> qq;@FXMLprivate TextField search;@FXMLprivate TextField search2;@FXMLprivate ImageView setting;@FXMLprivate Button voice;@FXMLprivate ImageView voice1;@FXMLprivate ImageView voice2;@FXMLprivate Button activeButton; // 当前激活的按钮@FXMLpublic void initialize() {// 初始化所有悬停图片为不可见setInitialStates();// 绑定悬停效果(所有按钮)bindHoverEffects();// 绑定点击效果(特定按钮)bindClickEffects();}private void setInitialStates() {// 设置初始可见性(确保FXML中默认显示1号图片)friend2.setVisible(false);avatar2.setVisible(false);info2.setVisible(false);message2.setVisible(false);memes2.setVisible(false);file2.setVisible(false);photo2.setVisible(false);voice2.setVisible(false);}private void bindHoverEffects() {setupHoverEffect(friend, friend1, friend2);setupHoverEffect(message, message1, message2);setupHoverEffect(info, info1, info2);setupHoverEffect(avatar, avatar1, avatar2);setupHoverEffect(memes, memes1, memes2);setupHoverEffect(file, file1, file2);setupHoverEffect(photo, photo1, photo2);setupHoverEffect(voice, voice1, voice2);}private void bindClickEffects() {// 特定按钮的点击效果setupClickEffect(friend, friend1, friend2);setupClickEffect(avatar, avatar1, avatar2);setupClickEffect(info, info1, info2);setupClickEffect(message, message1, message2);}// 悬停效果处理(通用方法)private void setupHoverEffect(Button btn, ImageView normal, ImageView hover) {btn.setOnMouseEntered(e -> {if (btn != activeButton) { // 非激活状态才响应悬停normal.setVisible(false);hover.setVisible(true);}});btn.setOnMouseExited(e -> {if (btn != activeButton) { // 非激活状态才恢复normal.setVisible(true);hover.setVisible(false);}});}// 点击效果处理(特定按钮)private void setupClickEffect(Button btn, ImageView normal, ImageView active) {btn.setOnAction(e -> {if (btn == activeButton) {// 点击已激活的按钮:取消激活normal.setVisible(true);active.setVisible(false);activeButton = null;} else {// 取消之前的激活状态if (activeButton != null) {resetPreviousActive();}// 设置新的激活状态normal.setVisible(false);active.setVisible(true);activeButton = btn;}});}private void resetPreviousActive() {// 根据按钮类型重置状态if (activeButton == friend) {friend1.setVisible(true);friend2.setVisible(false);} else if (activeButton == avatar) {avatar1.setVisible(true);avatar2.setVisible(false);} else if (activeButton == info) {info1.setVisible(true);info2.setVisible(false);} else if (activeButton == message) {message1.setVisible(true);message2.setVisible(false);}}@FXMLvoid exchange(ActionEvent event) {}@FXMLvoid exchangeAvatar(ActionEvent event) {}@FXMLvoid exchangeFile(ActionEvent event) {}@FXMLvoid exchangeInfo(ActionEvent event) {}@FXMLvoid exchangeMemes(ActionEvent event) {}@FXMLvoid exchangeMessage(ActionEvent event) {}@FXMLvoid exchangePhoto(ActionEvent event) {}@FXMLvoid exchangeVoice(ActionEvent event) {}}

相关文章:

悬停以及点击切换图片

为了实现悬停切换图片的功能&#xff0c;我们可以为每个按钮添加鼠标悬停事件监听器。以下是详细步骤和代码&#xff1a; 首先在控制器类中添加初始化方法&#xff0c;并添加事件监听器&#xff1a; package com.example.demo6;import javafx.event.ActionEvent; import java…...

Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例

Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例 内容概要 第8章深入探讨了计算机视觉中的深度学习&#xff0c;特别是卷积神经网络&#xff08;convnets&#xff09;的应用。本章详细介绍了卷积层和池化层的工作原理、数据增强技术、预训练模型的特征…...

Python基础总结(九)之推导式

文章目录 一、列表推导式1.1 列表推导式的格式1.2 列表推导式的注意事项1.3 列表推导式示例 二、 字典推导式2.1 字典推导式格式2.2 字典推导式注意事项2.3 字典推导式示例 三、 元组推导式3.1 元组推导式格式3.3 元组推导式示例 Python中的推导式有列表推导式&#xff0c;字典…...

[免费]SpringBoot+Vue博物馆(预约)管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue博物馆(预约)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue博物馆(预约)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着计算机科学技术的日渐成熟&#xff…...

基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发

基于LangChain4J的AI Services实践&#xff1a;用声明式接口重构LLM应用开发 前言&#xff1a;当Java开发遇上LLM编程困境 在LLM应用开发领域&#xff0c;Java开发者常面临两大痛点&#xff1a;一是需要手动编排Prompt工程、记忆管理和结果解析等底层组件&#xff0c;二是复杂…...

制作一款打飞机游戏12:初稿原型

当前进展 ‌任务回顾‌&#xff1a;在之前&#xff0c;我们做了大量的规划和原型设计。我们创建了关卡&#xff0c;添加了侧向滚动和BOSS模式背景重复&#xff0c;还制作了一个紧凑的瓦片集。‌原型完成‌&#xff1a;我们完成了五个原型&#xff0c;基本实现了飞机飞行、滚动…...

【python】pyCharm常用快捷键使用-(2)

pyCharm常用快捷键使用 快速导入任意类 【CTRLALTSPACE】代码补全【CTRLSHIFTENTER】代码快速修正【ALTENTER】代码调试快捷键...

位运算,状态压缩dp(算法竞赛进阶指南学习笔记)

目录 移位运算一些位运算的操作最短 Hamilton 路径&#xff08;状态压缩dp模板&#xff0c;位运算&#xff09; 0x是十六进制常数的开头&#xff1b;本身是声明进制&#xff0c;后面是对应具体的数&#xff1b; 数组初始化最大值时用0x3f赋值&#xff1b; 移位运算 左移 把二…...

极狐GitLab 项目 API 的速率限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目 API 的速率限制 (BASIC SELF) 引入于 15.10 版本&#xff0c;功能标志为rate_limit_for_unauthenticated_projects_api_…...

机器视觉lcd屏增光片贴合应用

在现代显示制造领域&#xff0c;LCD屏增光片贴合工艺堪称显示效果的"画龙点睛"之笔。作为提升屏幕亮度、均匀度和色彩表现的关键光学组件&#xff0c;增光片的贴合精度直接影响着终端用户的视觉体验。传统人工贴合方式难以满足当前超窄边框、高分辨率显示屏的严苛要求…...

VScode-py环境

settings.json {"git.ignoreLimitWarning": true,"code-runner.runInTerminal": true,"code-runner.executorMap": {"python": "python3"} } 第二句话保证在终端里面进行IO 第三句话保证python3的用户不会执行python关键…...

大模型面经 | 春招、秋招算法面试常考八股文附答案(三)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...

用键盘实现控制小球上下移动——java的事件控制

本文分享Java的一个有趣小项目&#xff0c;实现用键盘控制小球的移动 涉及java知识点&#xff1a;Swing GUI框架&#xff0c;绘图机制&#xff0c;事件处理&#xff0c;焦点控制 1.编写窗口和面板 (1.)定义面板类 Panel 继承自Java 自带类JPanel (2.)定义窗口类 window 继承…...

《Relay IR的基石:expr.h 中的表达式类型系统剖析》

TVM Relay源码深度解读 文章目录 TVM Relay源码深度解读一 、从Constant看Relay表达式的设计哲学1. 类定义概述2. ConstantNode 详解1. 核心成员2. 关键方法3. 类型系统注册 3. Constant 详解1. 核心功能 二. 核心内容概述(1) Relay表达式基类1. RelayExprNode 和 RelayExpr 的…...

《马尼拉》桌游期望计算器

《马尼拉》桌游期望计算器&#xff1a;做出最明智的决策 注&#xff1a;本项目仍在开发验证中&#xff0c;计算结果可能不够准确&#xff0c;欢迎游戏爱好者提供协助&#xff01; 在线使用 | GitHub 项目简介 马尼拉期望计算器是一个基于 Vue 3 Vite 开发的网页应用&#xff…...

23种设计模式-结构型模式之适配器模式(Java版本)

Java 适配器模式&#xff08;Adapter Pattern&#xff09;详解 &#x1f50c; 什么是适配器模式&#xff1f; 适配器模式用于将一个类的接口转换成客户端所期望的另一种接口&#xff0c;让原本接口不兼容的类可以协同工作。 &#x1f4e6; 就像插头转换器&#xff0c;让不同…...

动态LOD策略细节层级控制:根据视角距离动态简化远距量子态渲染

动态LOD策略在量子计算可视化中的优化实现 1. 细节层级控制:动态简化远距量子态渲染 在量子计算的可视化中,量子态通常表现为高维数据(如布洛赫球面或多量子比特纠缠态)。动态LOD(Level of Detail)策略通过以下方式优化渲染性能: 距离驱动的几何简化: 远距离渲染:当…...

算法 | 成长优化算法(Growth Optimizer,GO)原理,公式,应用,算法改进研究综述,matlab代码

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 成长优化算法 一、算法原理二、核心公式三、应用领域四、算法改进研究五…...

线程池的介绍

目录 一、什么是线程池 二、线程池的详细内容 三、线程池的简化 一、什么是线程池 提到线程池&#xff0c;我们可能想到 常量池&#xff0c;可以先来说说常量池&#xff1a; 像是字符串常量&#xff0c;在Java程序最初构建的时候&#xff0c;就已经准备好了&#xff0c;等程…...

安恒安全渗透面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...

基于瑞芯微RK3576国产ARM八核2.2GHz A72 工业评估板——ROS2系统使用说明

前 言 本文主要介绍创龙科技TL3576-MiniEVM评估板演示基于Ubuntu的ROS系统(版本:ROS2 Foxy)使用说明,包括镜像编译、镜像替换,以及ROS系统测试的方法。适用开发环境如下。 Windows开发环境:Windows 10 64bit Linux虚拟机环境:VMware16.2.5、Ubuntu22.04.5 64bit U-B…...

Python爬虫实战:获取高考网专业数据并分析,为志愿填报做参考

一、引言 高考志愿填报是考生人生的关键节点,合理的志愿填报能为其未来发展奠定良好基础。计算机类专业作为当下热门领域,相关信息对考生填报志愿至关重要。教育在线网站虽提供丰富的计算机类专业数据,但存在反爬机制,增加了数据获取难度。本研究借助 Scrapy 爬虫技术及多…...

计算机是如何工作的(上)

对于学习JavaEE初阶为什么要知道计算机是如何工作的&#xff0c;是因为在未来我们写代码的时候&#xff0c;会出现一些bug&#xff0c;而在代码层面是看不出来的&#xff0c;所以我们需要了解一些关于计算机内部是如何工作的&#xff0c;从而提高代码的健壮度。 计算机的组成&…...

基础服务系列-Windows10 安装AnacondaJupyter

下载 https://www.anaconda.com/products/individual 安装 安装Jupyter 完成安装 启动Jupyter 浏览器访问 默认浏览器打开&#xff0c;IE不兼容&#xff0c;可以换个浏览器 修改密码 运行脚本...

构造微调训练数据集

借助 ChatGPT 和 GPT API我们可以实现自动化批量构造训练数据集。 下面我们以中国古典哲学数据集为例&#xff0c;展示了自动构造训练集的主要流程: 使用 LangChain 构造训练数据样例 o基于 ChatGPT 设计 System Role 提示词 。使用 0penAI GPT-4o-mini 生成基础数据 解析 Open…...

Kubernetes架构介绍

实验环境 安装好k8s集群 一、kubernetes组件构成 1、架构图 2、组件介绍 使用以下命令查看相关资源 kubectl get nodes 查看群集节点 kubectl get ns 查看名称空间 kubectl get pod -A …...

远程服务器的mysql连接不上,问题出在哪里

使用本地ideal测试连接报错记录 排查 检查mysql服务是否正常,输入命令systemctl status mysql查看 检查端口netstat -plnt | grep mysql 最后检查服务器的防火墙设置 我以为在服务器厂商的控制面板设置放行规则就行&#xff0c;导致一直无法排查出问题&#xff0c;最后才发现由…...

Java高频面试之并发编程-04

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;调用 start()方法时会执行 run()方法&#xff0c;那为什么不直接调用 run()方法&#xff1f; 多线程中调用 start() 方法…...

【第16届蓝桥杯软件赛】CB组第一次省赛

个人主页&#xff1a;Guiat 归属专栏&#xff1a;算法竞赛 文章目录 A. 移动距离&#xff08;5分填空题&#xff09;B. 客流量上限&#xff08;5分填空题&#xff09;C. 可分解的正整数D. 产值调整E. 画展布置F. 水质检测G. 生产车间H. 装修报价 正文 总共10道题。 A. 移动距离…...

云原生--基础篇-2--云计算概述(云计算是云原生的基础,IaaS、PaaS和SaaS服务模型)

1、云计算概念 云计算是一种通过互联网提供计算资源&#xff08;包括服务器、存储、数据库、网络、软件等&#xff09;和服务的技术模式。用户无需拥有和维护物理硬件&#xff0c;而是可以根据需要租用这些资源&#xff0c;并按使用量付费。 2、云计算特点 &#xff08;1&am…...