Хорошо, поэтому я попытался реализовать подход camickr, но я столкнулся с некоторой очень неприятной проблемой в процессе. Я добавил MouseMotionListener в JTable для отслеживания текущей и предыдущей ячейки и добавил несколько методов, которые инструктируют средство визуализации о том, какой компонент возвращать, а затем перерисовывают соответствующую ячейку. Однако по какой-то странной причине каждая ячейка перекрашивается дважды, хотя был только один запрос на перерисовку. По сути, мне удавалось выделить ячейку при наведении курсора мыши, но было невозможно удалить выделение из ячейки, как только курсор мыши покинул ее. После первоначального замешательства я решил сделать это по-другому. Я добавил метод, который вызывает редактор, когда мышь находится над ячейкой, а затем добавил некоторый код, который останавливает редактирование, как только состояние 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();
}
}
Я надеюсь, что это поможет кому-то