我继承了JPanel,实现了TableCellRenderer接口,直接在JPanel上的组件上addMouseListener没有效果。应该如何才能对每个单元格实现鼠标监听呢?我想实现鼠标悬停在单元格上单元格背景变化的效果。多谢!

解决方案 »

  1.   

    那你要实现鼠标监听事件了,我想,因为我也没做过。
    一般是单元格change后才能触发事件,呵呵,楼主要求高了点
      

  2.   

    谢谢,我自己实现了。在我的Blog上
    http://blog.csdn.net/allenchue
      

  3.   

    import java.awt.*;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Point;
    import java.awt.event.MouseEvent;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.event.MouseInputListener;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;public class TableRolloverTest {
        public static void main(String[] args) {
            TableModel model = new DefaultTableModel(10, 10);
            JTable table = new JTable(model);
            RolloverRenderer renderer = new RolloverRenderer();
            table.setDefaultRenderer(Object.class, renderer);
            table.addMouseListener(renderer);
            table.addMouseMotionListener(renderer);        JScrollPane sp = new JScrollPane(table);
            JFrame f = new JFrame();
            f.getContentPane().add(sp, BorderLayout.CENTER);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(800, 600);
            f.setLocationRelativeTo(null);
            f.show();
        }
        
        private static class RolloverRenderer extends DefaultTableCellRenderer
                                              implements MouseInputListener
        {
            int row = -1;
            int col = -1;
            JTable table = null;        public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus, int row,
                    int column) {
                this.table = table;
                super.getTableCellRendererComponent(table, value,
                        isSelected, hasFocus, row, column);
                if (row == this.row && column == this.col) {
                    setBackground(Color.red);
                }
                else if (isSelected) {
                    setForeground(table.getSelectionForeground());
                    setBackground(table.getSelectionBackground());
                }
                else {
                    setBackground(Color.white);
                }
                return this;
            }        public void mouseExited(MouseEvent e) {
                if (table != null) {
                    int oldRow = row;
                    int oldCol = col;
                    row = -1;
                    col = -1;
        
                    if (oldRow != -1 && oldCol != -1) {
                        Rectangle rect = table.getCellRect(oldRow, oldCol, false);
                        table.repaint(rect);
                    }
                }
            }        public void mouseDragged(MouseEvent e) {
                mouseMoved(e);
            }        public void mouseMoved(MouseEvent e) {
                if (table != null) {
                    Point p = e.getPoint();
                    
                    int oldRow = row;
                    int oldCol = col;
                    row = table.rowAtPoint(p);
                    col = table.columnAtPoint(p);                if (oldRow != -1 && oldCol != -1) {
                        Rectangle rect = table.getCellRect(oldRow, oldCol, false);
                        table.repaint(rect);
                    }
                    if (row != -1 && col != -1) {
                        Rectangle rect = table.getCellRect(row, col, false);
                        table.repaint(rect);
                    }
                }
            }        public void mouseClicked(MouseEvent e) {}
            public void mousePressed(MouseEvent e) {}
            public void mouseReleased(MouseEvent e) {}
            public void mouseEntered(MouseEvent e) {}
        }
    }