使用鼠标监听器,使鼠标悬停在JTable某行时背景色改变
一、需要知道的事实:
1、当鼠标悬停在JTable上时,相应的格子(cell)的渲染器(TableCellRenderer)的渲染方法(getTableCellRenererComponent)会被调用,但不够及时(这一点可以通过在渲染方法里打印一句话来自行测试),
而且只是鼠标覆盖的格子的渲染方法会被调用,与其同一行的其他格子的渲染方法并未被调用。所以,指望只通过修改渲染器就能达到目的是不可能的了。
2、JTable的所有监听器都在TableUI(默认使用的是BasicTableUI)中定义,从BasicTableUI源代码中可以发现,关于鼠标的监听器,只有MouseInputListener,并不支持对鼠标悬停事件的监听。所以,如果你
重写TableUI,给JTable添加鼠标悬停行为事件监听器应该也可达到目的,但本文不讨论这种实现方式。
二、总体思路:
能不能不重写TableUI,用一个最直接的鼠标监听器达到目的?
首先自定义TableCellRenderer,通过JTable对象获取当前鼠标所在行的行号,在渲染方法里根据行号修改背景颜色。
然后给JTable添加一个鼠标行为监听器(MouseMotionListener),当监听到JTable的某行上有鼠标悬停时,触发JTable的prepareRenderer方法,促使JTable相应行中的格子进行渲染。然后调用JTable的repaint。
三、代码片断
// 为了简便,直接在构造JTable时把渲染器里的处理写在其中了,正常的做法是不需要修改JTable代码,在自定义的TableCellRenderer中写这些逻辑。
JTable table = new JTable(model){
@override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column){
Component comp = super.prepareRenderer(renderer,row,column);
Point p = getMousePosition();
if(p!=null){
int rowUnderMouse = rowAtPoint(p);
if(rowUnderMouse = row){
comp.setBackground(Color.red);
}else{
comp.setBackGround(DefaultLookup.getColor(this,ui,"Table.alternateRowColor"));
}
}
return comp;
}
}
class MyTableMouseMotionListener extends MouseMotionAdapter{
private int rowUnderMouse = -1;
@override
public void mouseMoved(MouseEvent e){
JTable table = (JTable)e.getSource();
Point p = table.getMousePosition();
if(p != null){
rowUnderMouse = table.rowAtPoint(p);
if(rowUnderMouse >= 0){
for(int i=0;i<table.getColumnCount();i++){
table.prepareRenderer(table.getCellRenderer(rowUnderMouse,i),rowUnderMouse,i);
if(rowUnderMouse != 0){
table.prepareRenderer(table.getCellRenderer(rowUnderMouse-1,i),rowUnderMouse-1,i);
}
if(rowUnderMouse != table.getRowCount()-1){
table.prepareRenderer(table.getCellRenderer(rowUnderMouse+1,i),rowUnderMouse+1,i);
}
}
table.repaint(table.getVisibleRect());
}
}
}
}
最后,table.addMouseMotionListener(new MyTableMouseMotionListener());
使用鼠标监听器,使鼠标悬停在JTable某行时背景色改变的更多相关文章
- Java基础之处理事件——选项按钮的鼠标监听器(Lottery 2 with mouse listener)
控制台程序. 定义监听器类有许多方式.下面把监听器类定义为单独的类MouseHandler: // Mouse event handler for a selection button import ...
- Flex中如何通过showAllDataTips属性使鼠标移动到图表时显示所有的数据Tips的例子
原文 http://blog.minidx.com/2008/11/10/1616.html 接下来的例子演示了Flex中如何通过showAllDataTips属性,使鼠标移动到图表时显示所有的数据T ...
- Unity编辑器 - 鼠标悬停在控件上时改变鼠标样式
Unity编辑器 - 鼠标悬停在控件上时改变鼠标样式 摘自Unity文档 EditorGUIUtility.AddCursorRect public static void AddCursorRect ...
- lightinthebox头部分类菜单下拉导航,使鼠标移到See All Categories就显示下拉菜单
lightinthebox头部分类菜单下拉导航,使鼠标移到See All Categories就显示下拉菜单 打开includes\templates\lightinthebox\common\tpl ...
- JAVA鼠标监听器
package howework_07; public class Example9_10 { public static void main(String args[]) { WindowMouse ...
- c#全局鼠标事件以及鼠标事件模拟
最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...
- 模拟在table中移动鼠标,高亮显示鼠标所在行
在项目中有这样一个需求,在table中移动鼠标时,鼠标所在行高亮显示,其他行正常显示,为此做了一个模拟. 具体代码如下: <!DOCTYPE html> <html xmlns=&q ...
- WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件
在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件.例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开.在这个过程中,控 ...
- 用VBS控制鼠标(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击、鼠标右击)
Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog » 程序设计 » 用VBS控制鼠标(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击) « bbPress积分 ...
随机推荐
- java concurrency
Dealing with InterruptedExceptionhttp://www.ibm.com/developerworks/java/library/j-jtp05236/index.htm ...
- python(28)获得网卡的IP地址,如何在其他文件夹中导入python模块
获得第几块网卡的ip地址: 如何在其他文件夹中导入模块 import sys sys.path.append('/search/chen/tool')#你的代码存放的目录 from Get_Ip im ...
- js实现类似新闻条目人物简介不间断的滚动
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 续写上一篇的数组or指针操作
C语言,同样使用if else while 这样的语法,但不同的人,就是有不同的实现方式,甚至是技巧. eg: #include <stdio.h> #include<string. ...
- openldap 备份与导入 及相关问题
摘要: 对openldap进行备份时,直接使用slapcat命令进行备份,使用ldapadd还原出现问题及解决. 介绍: 对openldap进行备份时,直接使用slapcat命令进行备份(如代码一), ...
- 从sql中image类型字段中导出图片
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- [app]Linux的setitimer和sleep冲突
在Linux中使用setitimer和sleep会冲突,二者都是用信号 碰上一个头疼的问题,主程序在sleep的时候,总是被开的一个timer的signal callback所影响, 每当timer的 ...
- Red Hat快捷键操作
Red Hat快捷键操作 .使用虚拟控制台 登录后按“Alt+F2”键可以看到“login:”提示符, 这就是第二个虚拟控制台. 一般新安装的Linux有四个虚拟控制台, 可以用“Alt+F1”到“A ...
- Android——电脑蓝屏重启后,studio无法认出Android环境 setup JDK(缓存!缓存!缓存)
电脑蓝屏重启后,studio无法认出Android环境 setup JDK 问题重现:因为工作问题,需要用到模拟器,然后创建了模拟器后开启了漫长的等待之旅,两三分钟之后win8蓝屏,重启,再次打开,依 ...
- CAS (3) —— Mac下配置CAS客户端经代理访问Tomcat CAS
CAS (3) -- Mac下配置CAS客户端经代理访问Tomcat CAS tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 nginx版本: nginx-1.9 ...