JTable щелкните правой кнопкой мыши ActionListener не возвращает правильные значения строки и столбца

avatar
leah
9 августа 2021 в 00:11
156
1
0

У меня есть фрагмент кода, определяющий щелчок правой кнопкой мыши на JTable:

jt.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent e) {
        if(e.getButton() == MouseEvent.BUTTON3) {
            JTable target = (JTable)e.getSource();
            int row = target.getSelectedRow();
            int column = target.getSelectedColumn();
            System.out.println(row + column);
            System.out.println(column);
            System.out.println("right click!");
        }
    }
});

Мне нужны значения строки и столбца, чтобы система вычисляла содержимое ячейки, по которой щелкнули, чтобы я мог запускать функции и прочее, но для моей текущей таблицы jt: enter image description here

Когда я щелкаю правой кнопкой мыши по любой ячейке в строке, возвращается "правый щелчок!" (что правильно) и "-2 -1" для значений строки и столбца. Учитывая, что они находятся в разных столбцах таблицы, значения строк и столбцов должны быть положительными, а значения столбцов должны быть разными. Я не понимаю, что здесь происходит, из-за чего этот код не работает.

Примечание: ранее у меня был if (e.getClickCount() == 2) { do stuff }, прежде чем я заменил его на функцию правого щелчка, и он работал нормально - возвращал правильные строки и столбцы.

Источник
Andrew Thompson
9 августа 2021 в 00:18
1

Чтобы быстрее получить помощь, отредактируйте, добавив минимальный воспроизводимый пример или Короткий, автономный, правильный пример. Данные жесткого кода для таблицы.

Hovercraft Full Of Eels
9 августа 2021 в 00:24
1

Я с @AndrewThompson, так как не могу воспроизвести вашу проблему на основе того, что вы опубликовали.

Hovercraft Full Of Eels
9 августа 2021 в 00:36
1

Конечно, есть методы convertColumnIndexToModel(...) и convertRowIndexToModel(...), которые здесь важны и, возможно, нужны, но я не вижу, чтобы они работали со значениями -1 (значение, которое предполагает, что ни одна строка или столбец еще не выбраны). ).

Andrew Thompson
9 августа 2021 в 00:45
0

@HovercraftFullOfEels Я (колебался, чтобы отложить трудные вещи, которые я должен делать, и ..) сделал краткий пример кода, чтобы проверить теорию, которая подтвердилась. Щелчок правой кнопкой мыши по таблице не будет выбирать что-либо.

Hovercraft Full Of Eels
9 августа 2021 в 00:50
1

Мы могли бы проголосовать за повторное открытие, если вы хотите опубликовать это

Hovercraft Full Of Eels
9 августа 2021 в 00:54
0

@AndrewThompson: что скажешь?

Andrew Thompson
9 августа 2021 в 02:34
0

@HovercraftFullOfEels "Что скажешь?" Спасибо! Введен ответ. (Извините, я отвлёкся на другие вещи, которые должен был сделать.)

Ответы (1)

avatar
Andrew Thompson
9 августа 2021 в 02:32
2

Щелчок правой кнопкой мыши по таблице не будет выбирать что-либо.

Вот что произойдет, если я щелкну правой кнопкой мыши в любом месте таблицы, как только появится графический интерфейс.

enter image description here

Принимая во внимание, что это то, что я вижу после щелчка левой кнопкой мыши в среднем столбце первой строки, затем щелкните правой кнопкой мыши в любом месте в таблице:

enter image description here

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class TableSelectionWithMouse {

    private JComponent ui = null;
    String[] headers = {"First Name", "Last Name", "Occupation"};
    String[][] data = {
        {"Yohan", "Jones", "Mouse Wrangler"},
        {"Lucy", "Yang", "Emeritus Professor of Phlogiston"}
    };
    JLabel output = new JLabel("Right click to do .. stuff");

    TableSelectionWithMouse() {
        initUI();
    }

    public void initUI() {
        if (ui != null) {
            return;
        }

        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        final JTable table = new JTable(data, headers);
        ui.add(new JScrollPane(table));
        ui.add(output, BorderLayout.PAGE_END);
        MouseListener mouseListener = new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println(".mouseClicked()" + e);
                if (e.getButton() == MouseEvent.BUTTON3) {
                    JTable target = (JTable) e.getSource();
                    int row = target.getSelectedRow();
                    int column = target.getSelectedColumn();
                    output.setText(String.format("Row: %1s Col: %1s", row, column));
                }
            }
        };
        table.addMouseListener(mouseListener);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                TableSelectionWithMouse o = new TableSelectionWithMouse();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}
camickr
9 августа 2021 в 02:43
0

Это объясняет, что происходит, но не объясняет, как получить строку/столбец по щелчку правой кнопкой мыши, что является требованием вопроса.