鼠标进入时如何更改一行中的所有JTable列颜色?

问题描述

我希望当鼠标在表格中输入一行时,我希望该行中的每一列颜色都变为蓝色。

我已经这样做了,它发生了变化,但只有在我按下鼠标时才会发生变化,而不是在我的鼠标进入时发生变化。

 private void changeColorTableCell(JTable tbl,int index) {
    tbl.getColumnModel().getColumn(index).setCellRenderer(new DefaultTableCellRenderer(){
        @Override
        public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column) {
            final Component c =  super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); 
            c.setBackground(Color.BLUE);
            return c;
        }      
    });
}

private void tabelPesananMouseEntered(java.awt.event.MouseEvent evt) {                                          

    int count = tabelPesanan.getColumnModel().getColumnCount();
    for(int i = 0; i < count; i++) {
        changeColorTableCell(tabelPesanan,i);
    }        
}     

如何在鼠标进入时更改所有 JTable 列的颜色?

解决方法

getColumn(index).setCellRenderer(…) 不起作用。如果你想改变整行的颜色,你不能只改变一列的渲染器。

虽然您可以设置默认渲染器,也可以设置每列的单元格渲染器,但更好的选择是覆盖 prepareRenderer,这样除了背景颜色之外,任何其他渲染器都不会受到影响。>

private int hoveredRow = -1;

// ...

    JTable tabelPesanan = new JTable() {
        private static final long serialVersionUID = 1;

        @Override
        public Component prepareRenderer(TableCellRenderer renderer,int row,int column) {
            Component component =
                super.prepareRenderer(renderer,row,column);

            if (row == hoveredRow) {
                component.setBackground(Color.BLUE);
            } else if (isCellSelected(row,column)) {
                component.setBackground(getSelectionBackground());
            } else {
                component.setBackground(getBackground());
            }

            return component;
        }
    };

    MouseInputListener hoveredRowUpdater = new MouseInputAdapter() {
        private void repaintRow(int row) {
            if (row >= 0) {
                Rectangle bounds = tabelPesanan.getCellRect(row,true);
                int width = tabelPesanan.getWidth();
                tabelPesanan.repaint(0,bounds.y,width,bounds.height);
            }
        }

        private void updateHoveredRowFrom(MouseEvent event) {
            int oldHoveredRow = hoveredRow;
            hoveredRow = tabelPesanan.rowAtPoint(event.getPoint());
            repaintRow(oldHoveredRow);
            repaintRow(hoveredRow);
        }

        @Override
        public void mouseEntered(MouseEvent event) {
            updateHoveredRowFrom(event);
        }

        @Override
        public void mouseExited(MouseEvent event) {
            updateHoveredRowFrom(event);
        }

        @Override
        public void mouseMoved(MouseEvent event) {
            updateHoveredRowFrom(event);
        }

        @Override
        public void mouseDragged(MouseEvent event) {
            updateHoveredRowFrom(event);
        }
    };

    tabelPesanan.addMouseListener(hoveredRowUpdater);
    tabelPesanan.addMouseMotionListener(hoveredRowUpdater);