使用鼠标监听器,使鼠标悬停在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积分 ...
随机推荐
- hdoj 1698 Just a Hook 【线段树 区间更新】
题目大意:有一段链子.初始的时候是铜的(价值为1),n代表有n段(1~n),输入a, b, c三个数分别表示将从a到b的链子的价值改为c, 最后问你经过多次改变之后的总价值. 策略:这道题是简单的线段 ...
- 每日英语:Mooncake Austerity Hits China's Mid-Autumn Festival
First baijiu, then red carpets, and now mooncakes. For Chinese government officials, the list of tab ...
- Makefile学习之路——1
编写makefile,不是一个猛子扎进去试着写一个规则并对之调试,而应该先采用面向依赖关系的思考方法勾勒出makefile要表达怎样的依赖关系,这一点尤为重要.通过不断地练习这种思考方法,才可能达到流 ...
- elasticsearch的python增删查改实例分析
Reference: http://bigg.top/2015/11/29/elasticsearch%E7%9A%84python%E5%A2%9E%E5%88%A0%E6%9F%A5%E6%94 ...
- html5和css3打造一款创意404页面
之前和网友分享一款HTML5可爱的404页面动画 很逗的机器人.今天要爱编程小编要再给大家带来一款html5和css3打造的创意404页面.一起看下效果图吧: 在线预览 源码下载 实现的代码. h ...
- Android笔记(十一)第一个Fragment
Fragment是碎片的意思,能够參照Activity来理解Fragment,由于它们都能包括布局,都有自己的生命周期. 以下我们要让主活动包括两个碎片,而且让两个碎片充满屏幕 1.首先,新建两个碎片 ...
- OpenFileDialog 打开文件
OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "选择导入的文件"; ofd.FilterIndex = 1; ofd ...
- Windows Server 2008组策略安全实践(同样适用于域控制)
Windows Server 2008系统的安全功能非法强大,而它的强大之处不仅仅是新增加了一些安全功能,而且还表现在一些不起眼的传统功能上.对Windows Server 2008系统的组策略功能进 ...
- C#中对 XML节点进行添加,删除,查找和删除操作
从网上整理所得 XMLDocument来操作XML比较简单,虽然有时效率不是很高.代码如下 已知有一个XML文件(bookstore.xml)如下: <?xml version="1. ...
- 使用powerdesinger逆向生成表结构
(1).使powerdesigner建立和数据库的链接 (2)配置链接详情 (3) (4) (5)更新表结构 (6) (7) 附加:当有时候会报错时: 解决方式: (1.1)更改所连接的数据库 (1. ...