有没有办法让细胞渲染器响应鼠标事件,例如鼠标悬停?
答案 0 :(得分:3)
从未尝试过,但我想你需要:
a)创建一个自定义渲染器,将单元格绘制成两种状态
b)您需要跟踪当前应该在“鼠标悬停”状态下绘制哪个单元格
c)添加鼠标监听器以跟踪鼠标输入/退出和mouseMoved。对于每个事件,您需要更新一个跟踪鼠标位于哪个单元格的变量。您 可以使用JTable的columnAtPoint()和rowAtPoint()方法
d)当鼠标离开细胞时,你需要在细胞上调用repaint()。您可以使用getCellRect()方法来确定要重绘的单元格
e)当鼠标进入细胞时,您需要重置“鼠标悬停”状态的细胞值,然后重新绘制细胞。
答案 1 :(得分:0)
好的,所以我尝试了实现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();
}
}
我希望这能帮到某人