简体   繁体   English

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

[英]How to change all JTable column color in a row when mouse entered?

I want when the mouse enter a row in table, I want every column colors in that row change to blue.我希望当鼠标在表格中输入一行时,我希望该行中的每一列 colors 都变为蓝色。

I have done this, and it changed, but it only change when I press my mouse not when my mouse enter it.我已经这样做了,它改变了,但它只在我按下鼠标时改变,而不是当我的鼠标进入它时改变。

 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);
    }        
}     

How to change all JTable column color in a row when mouse entered ?鼠标进入时如何连续更改所有JTable列颜色?

getColumn(index).setCellRenderer(…) won't work. getColumn(index).setCellRenderer(…)不起作用。 If you want to change the color of an entire row, you can't just change the renderer of one column.如果你想改变整行的颜色,你不能只改变一列的渲染器。

While you could set a default renderer, or you could set the cell renderers of each column, the better option is to override prepareRenderer , so any other renderers will not be affected aside from their background color.虽然您可以设置默认渲染器,或者您可以设置每列的单元格渲染器,但更好的选择是覆盖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, 0, 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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM