Java 与JTable中的单元渲染器的交互

Java 与JTable中的单元渲染器的交互,java,swing,jtable,cell,renderer,Java,Swing,Jtable,Cell,Renderer,有没有办法让单元格渲染器响应鼠标事件,例如鼠标翻转?从未尝试过,但我想您需要: a) 创建自定义渲染器以在两种状态下绘制单元 b) 您需要跟踪当前处于“鼠标悬停”状态的单元格 c) 添加鼠标侦听器以跟踪鼠标输入/退出和鼠标移动。对于每个事件,您都需要更新一个变量,该变量跟踪鼠标放置在哪个单元格上。你 可以使用JTable的columnAtPoint()和rowAtPoint()方法 d) 当鼠标离开单元格时,需要在单元格上调用repaint()。可以使用getCellRect()方法确定要重新绘

有没有办法让单元格渲染器响应鼠标事件,例如鼠标翻转?

从未尝试过,但我想您需要:

a) 创建自定义渲染器以在两种状态下绘制单元

b) 您需要跟踪当前处于“鼠标悬停”状态的单元格

c) 添加鼠标侦听器以跟踪鼠标输入/退出和鼠标移动。对于每个事件,您都需要更新一个变量,该变量跟踪鼠标放置在哪个单元格上。你 可以使用JTable的columnAtPoint()和rowAtPoint()方法

d) 当鼠标离开单元格时,需要在单元格上调用repaint()。可以使用getCellRect()方法确定要重新绘制的单元格


e) 当鼠标进入单元格时,需要重置“鼠标悬停”状态的单元格值,然后重新绘制单元格

好的,所以我尝试了实施camickr的方法,但在这个过程中遇到了一些非常棘手的问题。我在JTable中添加了一个MouseMotionListener来跟踪当前和以前的单元格,并添加了一些方法来指示渲染器返回哪个组件,然后重新绘制相应的单元格。然而,由于一些奇怪的原因,每个单元格被重新绘制两次,即使只有一个重新绘制请求。基本上,我能够在鼠标滚动时突出显示单元格,但一旦鼠标光标离开单元格,就不可能从单元格中删除突出显示。在最初的困惑之后,我决定用另一种方式来做这件事。我添加了一个方法,当鼠标在单元格上时调用编辑器,然后添加了一些代码,一旦JToggleButton(我的渲染和编辑组件)的状态发生更改,就会停止编辑。我当前的代码如下所示:

package guipkg;

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class Grid extends JTable implements MouseListener {

int currentCellColumn = -1;
int currentCellRow = -1;
int previousCellColumn = -1;
int previousCellRow = -1;

public void detectCellAtCursor (MouseEvent e) {
    Point hit = e.getPoint();
    int hitColumn = columnAtPoint(hit);
    int hitRow = rowAtPoint(hit);
    if (currentCellRow != hitRow || currentCellColumn != hitColumn) {
        this.editCellAt(hitRow, hitColumn);
        currentCellRow = hitRow;
        currentCellColumn = hitColumn;
    }

}


}







package guipkg;

import javax.swing.table.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class TCEditor extends AbstractCellEditor implements TableCellEditor  {

    /**
     * A toggle button which will serve as a cell editing component
     */

    JToggleButton togglebutton = new JToggleButton();





    public Component getTableCellEditorComponent (JTable Table, Object value, boolean isSelected, int rindex, int cindex) {

        /**
         * We're adding an action listener here to stop editing as soon as the state of JToggleButton is switched.
         * This way data model is updated immediately. Otherwise updating will only occur after we've started to
         * edit another cell.
         */

        togglebutton.addActionListener(new ActionListener() {
            public void actionPerformed (ActionEvent e) {
                stopCellEditing();
            }
        });


        if (value.toString().equals("true")) {
            togglebutton.setSelected(true);
        }
 else {
            togglebutton.setSelected(false);
 }
        togglebutton.setBorderPainted(false);
        return togglebutton;
    }

    public Object getCellEditorValue () {
        return togglebutton.isSelected();
    }


}

我希望这能帮助一些人详细阐述一下:记住单元格渲染器(在表、列表、组合等中)始终只是一个橡皮图章,因此您需要向表中添加鼠标侦听器,然后委托给自定义渲染器/编辑器,使用
columnAtPoint
rowAtPoint
找出鼠标点的位置,正如@camickr所提到的。我应该如何告诉jtable在我的命令下检索并呈现一个新的单元格渲染器?repaint()请求应该做到这一点。