Взаимодействие с рендером ячеек в JTable - PullRequest
3 голосов
/ 22 сентября 2010

Есть ли способ заставить средство визуализации ячейки реагировать на события мыши, такие как наведение мыши?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2010

Никогда не пробовал, но я думаю, вам нужно:

a) создайте пользовательский рендер, чтобы нарисовать ячейку в двух состояниях

б) вам нужно следить за тем, какая ячейка должна быть в данный момент закрашена в состоянии «наведение мыши»

в) добавить слушателя мыши для отслеживания мыши, введенной / вышедшей из строя, и mouseMoved. С каждым событием вам нужно будет обновлять переменную, которая отслеживает, на какую ячейку располагается мышь. Вы можно использовать методы columnAtPoint () и rowAtPoint () из JTable

d) когда мышь покидает ячейку, вам нужно вызвать repaint () для ячейки. Вы можете использовать метод getCellRect (), чтобы определить, какую ячейку перекрашивать

e) когда мышь входит в ячейку, вам нужно сбросить значение ячейки для состояния «наведение мыши» и затем перекрасить ячейку.

0 голосов
/ 25 сентября 2010

Хорошо, поэтому я попытался реализовать подход 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();
    }


}

Я надеюсь, что это поможет кому-то

...