悬停以及点击切换图片
为了实现悬停切换图片的功能,我们可以为每个按钮添加鼠标悬停事件监听器。以下是详细步骤和代码:
- 首先在控制器类中添加初始化方法,并添加事件监听器:
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方法同理...
}
- 确保FXML中成对的ImageView初始状态正确(默认显示第一个图片),或者在initialize方法中设置初始可见性。
- 如果需要保留点击切换功能,可以在原有exchange方法中添加切换逻辑:
@FXML
void exchange(ActionEvent event) {boolean visible = friend2.isVisible();friend1.setVisible(!visible);friend2.setVisible(visible);
}
实现原理:
- 使用setOnMouseEntered和setOnMouseExited事件监听器
- 通过控制ImageView的visible属性切换图片显示
- 初始化时将所有悬停状态图片设为不可见
- 使用通用方法setupHoverEffect为所有按钮统一添加效果
注意事项:
- 确保图片资源路径正确
- 检查FXML中ImageView的叠加顺序(后定义的会在上层)
- 如果不需要点击事件,可以移除对应的onAction属性和控制器方法
- 所有按钮的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);}}
}
实现说明:
- 状态管理机制
• 使用activeButton变量跟踪当前激活的按钮• 点击时检查是否重复点击同一按钮,实现状态切换 - 悬停与激活状态的关系
// 在悬停处理中增加状态判断
if (btn != activeButton) {// 只有非激活按钮才会响应悬停
}
- 点击逻辑流程
FXML 需要调整的部分:
<!-- 移除所有按钮的 onAction 属性 -->
<Button fx:id="friend" ... /> <!-- 原 onAction="#exchange" 需要删除 -->
<Button fx:id="avatar" ... />
<Button fx:id="info" ... />
<Button fx:id="message" ... />
验证步骤:
- 点击 “好友” 按钮 →
friend2保持显示 - 悬停 “消息” 按钮 → 显示
message2(此时消息未激活) - 点击 “消息” 按钮 →
friend2消失,message2保持显示 - 再次点击 “消息” →
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) {}}
相关文章:
悬停以及点击切换图片
为了实现悬停切换图片的功能,我们可以为每个按钮添加鼠标悬停事件监听器。以下是详细步骤和代码: 首先在控制器类中添加初始化方法,并添加事件监听器: package com.example.demo6;import javafx.event.ActionEvent; import java…...
Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例
Python 深度学习 第8章 计算机视觉中的深度学习 - 卷积神经网络使用实例 内容概要 第8章深入探讨了计算机视觉中的深度学习,特别是卷积神经网络(convnets)的应用。本章详细介绍了卷积层和池化层的工作原理、数据增强技术、预训练模型的特征…...
Python基础总结(九)之推导式
文章目录 一、列表推导式1.1 列表推导式的格式1.2 列表推导式的注意事项1.3 列表推导式示例 二、 字典推导式2.1 字典推导式格式2.2 字典推导式注意事项2.3 字典推导式示例 三、 元组推导式3.1 元组推导式格式3.3 元组推导式示例 Python中的推导式有列表推导式,字典…...
[免费]SpringBoot+Vue博物馆(预约)管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue博物馆(预约)管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue博物馆(预约)管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着计算机科学技术的日渐成熟ÿ…...
基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发
基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发 前言:当Java开发遇上LLM编程困境 在LLM应用开发领域,Java开发者常面临两大痛点:一是需要手动编排Prompt工程、记忆管理和结果解析等底层组件,二是复杂…...
制作一款打飞机游戏12:初稿原型
当前进展 任务回顾:在之前,我们做了大量的规划和原型设计。我们创建了关卡,添加了侧向滚动和BOSS模式背景重复,还制作了一个紧凑的瓦片集。原型完成:我们完成了五个原型,基本实现了飞机飞行、滚动…...
【python】pyCharm常用快捷键使用-(2)
pyCharm常用快捷键使用 快速导入任意类 【CTRLALTSPACE】代码补全【CTRLSHIFTENTER】代码快速修正【ALTENTER】代码调试快捷键...
位运算,状态压缩dp(算法竞赛进阶指南学习笔记)
目录 移位运算一些位运算的操作最短 Hamilton 路径(状态压缩dp模板,位运算) 0x是十六进制常数的开头;本身是声明进制,后面是对应具体的数; 数组初始化最大值时用0x3f赋值; 移位运算 左移 把二…...
极狐GitLab 项目 API 的速率限制如何设置?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 项目 API 的速率限制 (BASIC SELF) 引入于 15.10 版本,功能标志为rate_limit_for_unauthenticated_projects_api_…...
机器视觉lcd屏增光片贴合应用
在现代显示制造领域,LCD屏增光片贴合工艺堪称显示效果的"画龙点睛"之笔。作为提升屏幕亮度、均匀度和色彩表现的关键光学组件,增光片的贴合精度直接影响着终端用户的视觉体验。传统人工贴合方式难以满足当前超窄边框、高分辨率显示屏的严苛要求…...
VScode-py环境
settings.json {"git.ignoreLimitWarning": true,"code-runner.runInTerminal": true,"code-runner.executorMap": {"python": "python3"} } 第二句话保证在终端里面进行IO 第三句话保证python3的用户不会执行python关键…...
大模型面经 | 春招、秋招算法面试常考八股文附答案(三)
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
用键盘实现控制小球上下移动——java的事件控制
本文分享Java的一个有趣小项目,实现用键盘控制小球的移动 涉及java知识点:Swing GUI框架,绘图机制,事件处理,焦点控制 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 的…...
《马尼拉》桌游期望计算器
《马尼拉》桌游期望计算器:做出最明智的决策 注:本项目仍在开发验证中,计算结果可能不够准确,欢迎游戏爱好者提供协助! 在线使用 | GitHub 项目简介 马尼拉期望计算器是一个基于 Vue 3 Vite 开发的网页应用ÿ…...
23种设计模式-结构型模式之适配器模式(Java版本)
Java 适配器模式(Adapter Pattern)详解 🔌 什么是适配器模式? 适配器模式用于将一个类的接口转换成客户端所期望的另一种接口,让原本接口不兼容的类可以协同工作。 📦 就像插头转换器,让不同…...
动态LOD策略细节层级控制:根据视角距离动态简化远距量子态渲染
动态LOD策略在量子计算可视化中的优化实现 1. 细节层级控制:动态简化远距量子态渲染 在量子计算的可视化中,量子态通常表现为高维数据(如布洛赫球面或多量子比特纠缠态)。动态LOD(Level of Detail)策略通过以下方式优化渲染性能: 距离驱动的几何简化: 远距离渲染:当…...
算法 | 成长优化算法(Growth Optimizer,GO)原理,公式,应用,算法改进研究综述,matlab代码
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 成长优化算法 一、算法原理二、核心公式三、应用领域四、算法改进研究五…...
线程池的介绍
目录 一、什么是线程池 二、线程池的详细内容 三、线程池的简化 一、什么是线程池 提到线程池,我们可能想到 常量池,可以先来说说常量池: 像是字符串常量,在Java程序最初构建的时候,就已经准备好了,等程…...
安恒安全渗透面试题
《网安面试指南》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初阶为什么要知道计算机是如何工作的,是因为在未来我们写代码的时候,会出现一些bug,而在代码层面是看不出来的,所以我们需要了解一些关于计算机内部是如何工作的,从而提高代码的健壮度。 计算机的组成&…...
基础服务系列-Windows10 安装AnacondaJupyter
下载 https://www.anaconda.com/products/individual 安装 安装Jupyter 完成安装 启动Jupyter 浏览器访问 默认浏览器打开,IE不兼容,可以换个浏览器 修改密码 运行脚本...
构造微调训练数据集
借助 ChatGPT 和 GPT API我们可以实现自动化批量构造训练数据集。 下面我们以中国古典哲学数据集为例,展示了自动构造训练集的主要流程: 使用 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 最后检查服务器的防火墙设置 我以为在服务器厂商的控制面板设置放行规则就行,导致一直无法排查出问题,最后才发现由…...
Java高频面试之并发编程-04
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:调用 start()方法时会执行 run()方法,那为什么不直接调用 run()方法? 多线程中调用 start() 方法…...
【第16届蓝桥杯软件赛】CB组第一次省赛
个人主页:Guiat 归属专栏:算法竞赛 文章目录 A. 移动距离(5分填空题)B. 客流量上限(5分填空题)C. 可分解的正整数D. 产值调整E. 画展布置F. 水质检测G. 生产车间H. 装修报价 正文 总共10道题。 A. 移动距离…...
云原生--基础篇-2--云计算概述(云计算是云原生的基础,IaaS、PaaS和SaaS服务模型)
1、云计算概念 云计算是一种通过互联网提供计算资源(包括服务器、存储、数据库、网络、软件等)和服务的技术模式。用户无需拥有和维护物理硬件,而是可以根据需要租用这些资源,并按使用量付费。 2、云计算特点 (1&am…...
