Как получить индекс метки мыши, нажатой в JLabel [] []?

У меня есть двухмерный массив компонентов JLabel, и я хочу получить место, где мышь щелкнула на метке, как это.

Jlabel [x] [y] // I want this x & y

Как мне это сделать?

Я пробовал это, но ничего не получаю!

new MouseAdapter(){
    public void mousePressed(MouseEvent e){
        int a=e.getX();
        int b=e.getY();
        MainBoard.ML.label=MainBoard.disk1[a][b];
        Color c=MainBoard.ML.label.getForeground();
        if (color==1)
            MainBoard.ML.label.setForeground(Color.black);
        else
            MainBoard.ML.label.setForeground(Color.white);
        new Play(a,b,color);
        new Player2(r);
        MainBoard.disk1[a][b].addMouseListener(new ML1(a,b));
    }
};

Я хочу получить индекс x и y массива меток.

Вы назначаете MouseListener внутри события mousePressed? Это действительно то, чего вы хотите? Вы должны назначить MouseListener для каждой JLabel при их создании.

f1sh 10.07.2019 11:16

Я хочу получить место, где щелкнула мышь, и передать его ML для выполнения действия, если у вас есть идеи для этого, я буду признателен за это.

edie.lp 10.07.2019 11:18

Если прослушиватель мыши добавлен к самим меткам, e.getSource() получит метку, по которой щелкнули. Это единственная помощь, которую я могу (хочу попытаться) предоставить на основе текущей информации. Чтобы получить дополнительные или лучшие советы: 1) Чтобы быстрее получить помощь, редактировать добавить минимальный воспроизводимый пример или Короткий, автономный, правильный пример. 2) Используйте логическую и последовательную форму отступов строк и блоков кода. Отступы предназначены для облегчения понимания потока кода! В большинстве IDE есть сочетание клавиш специально для форматирования кода.

Andrew Thompson 10.07.2019 11:37

Как мне использовать e.getSource() для этого?

edie.lp 10.07.2019 11:46

Совет «Как мне использовать..»: добавьте @f1sh (или кого угодно, важно @) к уведомлять человеку нового комментария. Кроме того, f1sh сделал хорошее замечание, на которое вы должны обратить внимание: обнаружение события не место для прослушивания добавление.

Andrew Thompson 10.07.2019 12:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
257
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Непроверенный и нескомпилированный код для поиска нужных вам Икс и у приведен ниже.
Обратите внимание, что метод getX() класса MouseEvent получает местоположение указателя мыши на экране компьютера, а не Икс из вашего массива. Аналогично для метода getY(). Вот почему вы ничего не получаете.

В приведенном ниже коде я добавляю один и тот же MouseListener ко всем JLabel.

MouseEvent содержит JLabel, по которому была нажата мышь, и метод getSource() класса MouseEvent возвращает его. Затем вам нужно перебрать массив JLabel и посмотреть, какой из них соответствует источнику MouseEvent.

int rows = // number of rows in 2D array
int cols = // number of cols in 2D array
final JLabel[][] labels = new JLabel[rows][cols]
MouseListener ml = new MouseAdapter() {
    public void mousePressed(MouseEvent me) {
        Object src = me.getSource();
        int x = -1;
        int y = -1;
        for (int i = 0; i < labels.length(); i++) {
            for (int j = 0; j < labels[i].length; j++) {
                if (src == labels[i][j]) {
                    x = i;
                    y = j;
                    break;
                }
            }
            if (x >= 0) {
                break;
            }
        }
        if (x > 0) {
            System.out.printf("JLabel[%d][%d] was clicked.%n", x, y);
        }
        else {
            System.out.println("Could not find clicked label.");
        }
    }
}
for (int row = 0; row < rows; row++) {
    for (int col = 0; col < cols; col++) {
        labels[row][col] = new JLabel(row + "," + col);
        labels[row][col].addMouseListener(ml);
    }
}

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

edie.lp 10.07.2019 13:49

@edie.lp код, который я разместил, не является полной программой, он предназначен только для того, чтобы помочь вам начать работу.

Abra 10.07.2019 18:56

Спасибо за помощь

edie.lp 10.07.2019 23:15

Другие вопросы по теме