Как очистить выбор таблицы при нажатии на правой части таблицы - PullRequest
4 голосов
/ 11 февраля 2012

У меня есть JTable, который содержится в области прокрутки, которая, в свою очередь, находится на панели, встроенной в JFrame.Если JFrame развернут, то есть свободное место, как внизу, так и справа от JTable.

Я хочу отменить выбор в таблице, если пользователь щелкает вне таблицы, либо нижестол или справа от стола.

Чтобы очистить выделение, когда пользователь щелкает НИЖЕ таблицы, я настроил таблицу так, чтобы она заполняла высоту области просмотра полосы прокрутки, и добавил MouseListener в таблицу, чтобы при щелчке пользователя под таблицей, "rowAtPoint" возвращает -1, а затем я очищаю выбор.Тем не менее, это не работает для RHS таблицы.Стол даже не получает эти события мыши.Как мне обнаружить щелчок справа от JTable и отменить выбор на столе?Смотрите код ниже.Обратите внимание, что я не удосужился сделать код красивым и делать все правильно.Я сосредоточился только на создании SSCCE, который проиллюстрировал проблему.:)

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class TableTest {
    public static void main(String args[]) {
        JFrame f = new JFrame();
        JPanel p = new JPanel(new BorderLayout());
        JScrollPane sp = new JScrollPane();
        final JTable t = new JTable(5,5);
        t.setFillsViewportHeight(true);
        t.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

        for(int i = 0; i < 5; i++) {
            t.getColumnModel().getColumn(i).setWidth(50);
            t.getColumnModel().getColumn(i).setMaxWidth(75);
        }
        t.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                int row = t.rowAtPoint(e.getPoint());
                if(row == -1) {
                    t.clearSelection();
                }

            }
        });
        sp.getViewport().add(t);
        p.add(sp, BorderLayout.CENTER);
        f.add(p);

        f.pack();
        f.setVisible(true);
    }
}

РЕДАКТИРОВАТЬ: Я понимаю, что, возможно, я мог бы просто добавить слушатель мыши к панели прокрутки или панели, так что выбор таблицы очищается, когда я нажимаю на них.Мне просто интересно, есть ли лучшее / более чистое решение, чтобы убедиться, что выбор JTable очищается, когда я щелкаю за его пределами.

Ответы [ 3 ]

6 голосов
/ 11 февраля 2012

Исследуйте с помощью слушателя фокуса (table.addFocusListener( ... );), чтобы узнать, когда у таблицы / ячеек больше нет фокуса, и когда это так, вызовите: table.getSelectionModel().clearSelection();

2 голосов
/ 11 февраля 2012

Вы можете попробовать добавить глобальный слушатель мыши, как показано ниже:

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener(){
            @Override
            public void eventDispatched(AWTEvent event) {
                if(event.getID() == MouseEvent.MOUSE_CLICKED) {
                    MouseEvent mevent = (MouseEvent) event;
                     int row = t.rowAtPoint(mevent.getPoint());
                     if(row == -1) {
                         t.clearSelection();
                     }
                }               
            }           
        }, AWTEvent.MOUSE_EVENT_MASK);
0 голосов
/ 11 февраля 2012

Возможно, вы можете использовать FocusListener.

Когда таблица теряет фокус, вы можете отменить выбор.

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/event/FocusListener.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...