一、需要知道的事实:

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某行时背景色改变的更多相关文章

  1. Java基础之处理事件——选项按钮的鼠标监听器(Lottery 2 with mouse listener)

    控制台程序. 定义监听器类有许多方式.下面把监听器类定义为单独的类MouseHandler: // Mouse event handler for a selection button import ...

  2. Flex中如何通过showAllDataTips属性使鼠标移动到图表时显示所有的数据Tips的例子

    原文 http://blog.minidx.com/2008/11/10/1616.html 接下来的例子演示了Flex中如何通过showAllDataTips属性,使鼠标移动到图表时显示所有的数据T ...

  3. Unity编辑器 - 鼠标悬停在控件上时改变鼠标样式

    Unity编辑器 - 鼠标悬停在控件上时改变鼠标样式 摘自Unity文档 EditorGUIUtility.AddCursorRect public static void AddCursorRect ...

  4. lightinthebox头部分类菜单下拉导航,使鼠标移到See All Categories就显示下拉菜单

    lightinthebox头部分类菜单下拉导航,使鼠标移到See All Categories就显示下拉菜单 打开includes\templates\lightinthebox\common\tpl ...

  5. JAVA鼠标监听器

    package howework_07; public class Example9_10 { public static void main(String args[]) { WindowMouse ...

  6. c#全局鼠标事件以及鼠标事件模拟

    最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废, ...

  7. 模拟在table中移动鼠标,高亮显示鼠标所在行

    在项目中有这样一个需求,在table中移动鼠标时,鼠标所在行高亮显示,其他行正常显示,为此做了一个模拟. 具体代码如下: <!DOCTYPE html> <html xmlns=&q ...

  8. WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件

    在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件.例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开.在这个过程中,控 ...

  9. 用VBS控制鼠标(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击、鼠标右击)

    Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog  »  程序设计  »  用VBS控制鼠标(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击) « bbPress积分 ...

随机推荐

  1. Python 訪问Google+ (http)

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-8-28 @author: guaguastd @name: l ...

  2. 使用base64:url 来定义背景图片url

    普通的背景图片css是这样的: background-image:url(http://www.zhangxinxu.com/wordpress/wp-content/themes/default/i ...

  3. Cocos2d-x添加Android手机震动

    这个震动需要调用adnroid系统的方法,所以需要C++调用java,JNI这里就不多做介绍了,需要的可以自己去查找下相关资料,如果你只是需要实现这个功能,相信你看完本文,应该就OK了! 1.首先,修 ...

  4. ny2 括号配对问题

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=1 ...

  5. Gradle修改本地仓库的位置

    http://blog.csdn.net/tower888/article/details/38879955 http://blog.csdn.net/z69183787/article/detail ...

  6. VxWorks中logMsg与printf的区别

    printf( ) - write a formatted string to the standard output stream (ANSI). logMsg( ) does not actual ...

  7. hdu1495(经典bfs,平分水问题)

    思路:搜索题,第一次做这种类型的题目吧,一开始表示不怎么明白题意所说的东东.其实就是要你判断可乐能不能被平分........ 有六种状态,从a瓶到b瓶,a-->c b-->a     b- ...

  8. aspx小集合

    1.注意GroupName <asp:RadioButton ID="rdoF" runat="server" Text="男" Ch ...

  9. php底层HashTable的实现

    本文转载自:  http://segmentfault.com/blog/tree/1190000000718519 HashTable对PHP来说是一种非常重要的数据结构.很多PHP的内部实现(变量 ...

  10. Shell脚本编程入门到放弃

    1 区分大小写 UNIX是区分大小写的,因此shell脚本也是区分大小写的 2 特殊字符 UNIX的某些字符都有特殊的意义或功能,如果它们不以其特殊的意义使用必须要进行转义(escaped). 为了转 ...