如何为JTable中的行添加鼠标悬停(Rollover)效果?
给JTable添加行悬停效果(无需继承JTable)
不用继承JTable也能轻松实现这个需求,完全适配你现有继承JInternalFrame的类结构——直接给已有的JTable加自定义渲染器和鼠标监听就行,步骤如下:
步骤1:自定义TableCellRenderer处理行背景切换
先写一个单元格渲染器,继承默认的DefaultTableCellRenderer,既复用原有渲染逻辑,又能根据鼠标悬停状态切换背景色,同时保留选中行的默认样式:
import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; public class HoverTableCellRenderer extends DefaultTableCellRenderer { private int hoverRow = -1; // 默认无悬停行 @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); // 选中行样式优先级最高,保留默认选中效果 if (isSelected) { setBackground(table.getSelectionBackground()); setForeground(table.getSelectionForeground()); } else { // 非选中行:如果是悬停行用自定义色,否则用默认背景 if (row == hoverRow) { setBackground(new Color(232, 242, 254)); // 可替换成你喜欢的悬停色 } else { setBackground(table.getBackground()); } setForeground(table.getForeground()); } return this; } // 更新悬停行号的方法 public void setHoverRow(int hoverRow) { this.hoverRow = hoverRow; } // 获取当前悬停行号的方法 public int getHoverRow() { return hoverRow; } }
步骤2:给JTable绑定渲染器和鼠标监听
在你的UpdateAdmin类中,初始化JTable后,把自定义渲染器绑定到表格,并添加鼠标监听跟踪悬停行:
public class UpdateAdmin extends JInternalFrame { public static JTable table; // 假设你的JTable实例是这个变量 public UpdateAdmin() { // 这里保留你原有的界面初始化逻辑(比如创建TableModel、初始化JTable等) // 1. 实例化自定义渲染器 HoverTableCellRenderer hoverRenderer = new HoverTableCellRenderer(); // 2. 给表格所有列绑定这个渲染器 for (int i = 0; i < table.getColumnCount(); i++) { table.getColumnModel().getColumn(i).setCellRenderer(hoverRenderer); } // 3. 添加鼠标移动监听,跟踪悬停行 table.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { int currentRow = table.rowAtPoint(e.getPoint()); // 只有行号变化时才更新,避免不必要的重绘 if (currentRow != hoverRenderer.getHoverRow()) { hoverRenderer.setHoverRow(currentRow); table.repaint(); } } }); // 4. 添加鼠标退出监听,恢复默认样式 table.addMouseListener(new MouseAdapter() { @Override public void mouseExited(MouseEvent e) { hoverRenderer.setHoverRow(-1); table.repaint(); } }); } }
额外小贴士
- 悬停颜色可以自由调整:比如用系统自带的高亮色
UIManager.getColor("List.selectionBackground").brighter(),或者直接写RGB值。 - 如果你的表格有特殊列需要单独渲染,只需要给对应列单独设置渲染器,其他列用这个悬停渲染器即可,互不冲突。
- 这个方案完全不影响表格原有的选中、编辑、排序等功能,兼容性拉满。
内容的提问来源于stack exchange,提问作者Rahul patil
相关产品推荐
相关产品推荐

