You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:17:51