Щелкните правой кнопкой мыши MouseListener на всем компоненте JTable.

Я использую Netbeans, и я разработал окно с JTable и добавил прослушиватель MouseEvent в компонент JTable и добавил этот код:

private void productsTableMousePressed(java.awt.event.MouseEvent evt) {
    if(evt.isPopupTrigger()) {
        tablePopupMenu.setLocation(evt.getXOnScreen(), evt.getYOnScreen());
        tablePopupMenu.setVisible(true);
        System.out.println("Fired!");
    }
}

private void productsTableMouseReleased(java.awt.event.MouseEvent evt) {
    if(evt.isPopupTrigger()) {
        tablePopupMenu.setLocation(evt.getXOnScreen(), evt.getYOnScreen());
        tablePopupMenu.setVisible(true);
    }
}

Но это работает только тогда, когда я нажимаю на некоторые ячейки. Я хочу, чтобы он работал на всей области JTable. Как?


person Mikołaj Stolarski    schedule 17.01.2012    source источник


Ответы (3)


Предполагая, что ваша таблица находится внутри JScrollPane, она может не охватывать всю область просмотра. Чтобы обеспечить охват всей области окна просмотра, вызовите setFillsViewportHeight(true) на вашем столе.

person jackrabbit    schedule 18.01.2012
comment
Да, вы правы, это была моя проблема :) Я понял это несколько минут назад. Но спасибо за этот метод, потому что я решил, что он запускает mousePressed на JScrollPane, но ваши решения звучат лучше. - person Mikołaj Stolarski; 18.01.2012
comment
Кажется, не многие люди знают, как правильно взаимодействовать с JScrollPane. Я сам до сих пор борюсь с этим больше, чем хотелось бы. - person jackrabbit; 18.01.2012

Но это работает только тогда, когда я нажимаю на некоторые ячейки, но я хочу, чтобы он работал на всей области JTable.

MouseListener будет работать со всеми ячейками. Я не знаю, следует ли вам использовать метод setLocation(...).

Пример кода см. в разделе Вызов всплывающего меню.

Или лучший подход заключается в использовании:

table.setComponentPopupMenu(...);
person camickr    schedule 18.01.2012
comment
+1 для componentPopupMenu - это способ сделать это :-) Учебник устарел... - person kleopatra; 18.01.2012

Я обнаружил, что в моем JTable (который находится в JScrollPane, вложенном в JInternalFrame) могут быть проблемы с прокруткой и изменением размера, когда JTable больше, чем JScrollPane.

По сути, если кадр находится на моем левом мониторе, но я прокрутил таблицу до упора вправо, всплывающее окно появляется на моем правом мониторе.

Я рассмотрел результаты четырех различных вариантов: getMousePositions() для фрейма и области прокрутки, а также getX и getXOnScreen() для события мыши.

Единственное, что дало мне желаемые результаты, это getMousePositions() для фрейма. Все остальное компенсировалось его собственным внутренним взглядом на мир, что для меня имеет смысл.

Итак, я думаю, что я говорю, будьте осторожны, когда вы берете координаты мыши.

person Dave MacLeod    schedule 11.05.2013