Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
 Аватар для Doctor_
238 / 237 / 142
Регистрация: 03.02.2011
Сообщений: 1,437

Найти координаты нажатой кнопки в массиве

08.08.2013, 12:58. Показов 3862. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть 2Д массив кнопок, как получить координаты той которую нажали? Пытался сделать через getXPos() и getYPos()

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class GUI extends JFrame {
private JButton[][] playerBeforeReady;
//....
playerBeforeReady = new JButton[N][N];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                playerBeforeReady[i][j] = new JButton();
                playerPanel.add(playerBeforeReady[i][j]);
            }
        }
//....
forTone(playerBeforeReady);
//....
void forTone(JButton[][] test) {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                test[i][j].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evnt) {
                        int x = ((Coordinates) test[i][j]).getxPos();
                        System.out.println(x);
                    }
                });             
            }
        }
    }
}
 
class Coordinates extends JButton {
    private int xPos;
    private int yPos;
 
    public Coordinates(int xPos, int yPos) {
        this.xPos = xPos;
        this.yPos = yPos;
    }
 
    public int getxPos() {
        return xPos;
    }
 
    public int getyPos() {
        return yPos;
    }
}


Он хочет массив в final переделать(((
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.08.2013, 12:58
Ответы с готовыми решениями:

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

В двухмерном массиве найти максимальный и минимальный элементы и их координаты в массиве
&quot;В двухмерном массиве, размещенном в куче и заполненном случайными вещественными значениями, определить максимальных и минимальный элемент...

id нажатой кнопки
подскажите, пожалуйста, как определить нажатую кнопку. В форме созданы кнопки, и , если id равен id первой кнопки, вызвать макрос, если...

12
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
08.08.2013, 13:55
первое что пришло в голову это сделать так
Java
1
2
3
class myButton extends JButton {
    int tag;
}
и клепать кнопки из него, а не со стандартного JButton
а потом с ActionEvent evnt вытягивать tag, но я не уверен, что это самый оптимальный вариант
1
 Аватар для Doctor_
238 / 237 / 142
Регистрация: 03.02.2011
Сообщений: 1,437
08.08.2013, 14:09  [ТС]
Не совсем понимаю вашу реализацию.
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
08.08.2013, 14:30
Абсолютные координаты:
jButton.getLocationOnScreen()

Относительные координаты:
jButton.getLocation()

Возвращает объект типа Point c публичными полями x и y.
0
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
08.08.2013, 14:42
лучше я покажу, объяснять не силен
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
 
public class OwnButton extends JFrame {
 
    MyButton[][] buttonArray = new MyButton[5][5];
 
    public OwnButton() {
        setSize(700, 500);
        setLayout(null);
        setVisible(true);
 
        // Добавляем кнопки
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                buttonArray[i][j] = new MyButton(i, j);
                buttonArray[i][j].setText("Button");
                buttonArray[i][j].setBounds(i * 120, j * 50, 100, 40);
                add(buttonArray[i][j]);
 
                buttonArray[i][j].addActionListener(new ActionListener() {
 
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        MyButton mb = (MyButton) e.getSource();
                        System.out.println(mb.i + " " + mb.j);
                    }
                });
            }
        }
    }
 
    public static void main(String[] args) {
        OwnButton w = new OwnButton();
    }
}
 
class MyButton extends JButton {
    int i, j;
 
    MyButton(int i, int j) {
        this.i = i;
        this.j = j;
    }
}

я конечно тормознул, если надо координаты то выше правильно написали, а я то подумал что трудности с определением какую кнопку нажали
1
 Аватар для Doctor_
238 / 237 / 142
Регистрация: 03.02.2011
Сообщений: 1,437
08.08.2013, 15:08  [ТС]
verylazy, это надо создавать объект этого класса, печаль, так как объект инициализацируется в другом месте, и там нельзя закастить объект как MyButton. Ладно, спасибо.

Добавлено через 4 минуты
он почему-то все время возвращает 0 0 координаты((
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
08.08.2013, 16:24
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package easybudda.examples.buttoncoordinates;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class ButtonCoordinates {
    private final int ROWS = 4;
    private final int COLUMNS = 5;
    
    private JLabel infoLabel;
    
    public ButtonCoordinates() {
        infoLabel = new JLabel("Push some button");
        
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                JButton button = (JButton)(ae.getSource());
                Point relCoords = button.getLocation();
                Point screenCoords = button.getLocationOnScreen();
                infoLabel.setText("On screen: x = " + screenCoords.x + "; y = " + screenCoords.y +
                        ". On parent: x = " + relCoords.x + "; y = " + relCoords.y);
            }
        };
        
        JButton [] buttons = new JButton [ ROWS * COLUMNS ];
        for ( int i = 0; i < buttons.length; ++i ) {
            buttons[i] = new JButton(String.valueOf(i));
            buttons[i].addActionListener(listener);
        }
        
        JFrame frmMain = new JFrame("Button coordinates");
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setLayout(new BorderLayout());
        
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.setLayout(new GridLayout(ROWS, COLUMNS));
        for ( JButton b : buttons )
            buttonsPanel.add(b);
        
        frmMain.add(buttonsPanel, BorderLayout.CENTER);
        frmMain.add(infoLabel, BorderLayout.SOUTH);
        
        frmMain.pack();
        frmMain.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ButtonCoordinates();
            }
        });
    }
}
0
 Аватар для Doctor_
238 / 237 / 142
Регистрация: 03.02.2011
Сообщений: 1,437
08.08.2013, 17:02  [ТС]
Под словом координаты я думал как в массиве чисел, индексы кнопок.
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
08.08.2013, 17:23
Цитата Сообщение от Doctor_ Посмотреть сообщение
Под словом координаты я думал как в массиве чисел, индексы кнопок.
Откуда тогда X и Y? У вас двумерный массив кнопок?
0
 Аватар для Doctor_
238 / 237 / 142
Регистрация: 03.02.2011
Сообщений: 1,437
08.08.2013, 17:25  [ТС]
Просто название переменных такое, но мне нужны координаты кнопок по массиву i и j. Делаю как verylazy, но у меня ничего не происходит.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
class Buttons extends JButton {
    public int xPos;
    public int yPos;
 
    Buttons(int xPos, int yPos) {
        this.xPos = xPos;
        this.yPos = yPos;
    }
 
    public Buttons() {
    }
}
 
public class Test extends JFrame implements ActionListener {
 
    private Buttons[][] playerField;
    private JPanel player;
    private JPanel button;
    private JButton enabler;
 
    Test() {
        initFrame();
    }
 
    void initFrame() {
        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        button = new JPanel();
        enabler = new JButton("Enable buttons");
        button.add(enabler);
        enabler.addActionListener(this);
        add(button, BorderLayout.SOUTH);
        setVisible(true);
        initField();
    }
    
    void initField() {
        player = new JPanel();
        playerField = new Buttons[10][10];
        player.setLayout(new GridLayout(10, 10));
        for(int i = 0; i < 10; i++) {
            for(int j = 0; j < 10; j++) {
                playerField[i][j] = new Buttons();
                player.add(playerField[i][j]);
                playerField[i][j].setEnabled(false);
            }
        }
        add(player, BorderLayout.CENTER);
    }
 
    public void actionPerformed(ActionEvent ae) {
        Object source = ae.getSource();
        if (source == enabler) {
            for(int i = 0; i < 10; i++) {
                for(int j = 0; j < 10; j++) {
                    playerField[i][j].setEnabled(true);                 
                }
            }
            getCoord(playerField);
        }
    }
    
    void getCoord(Buttons[][] work) {
        for(int i = 0; i < 10; i++) {
            for(int j = 0; j < 10; j++) {
                work[i][j] = new Buttons(i, j);
                player.add(work[i][j]);
                work[i][j].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent evnt) {
                        Buttons coord = (Buttons)evnt.getSource();
                        System.out.println(coord.xPos + "  " + coord.yPos);
                    }
                });
            }
        }
    }
    
    public static void main(String[] args) {
        new Test();
    }
}
0
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
08.08.2013, 17:31
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
 
public class OwnButton extends JFrame {
 
    JButton[][] buttonArray = new JButton[5][5];
 
    public OwnButton() {
        setSize(700, 500);
        setLayout(null);
        // Добавляем кнопки
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                buttonArray[i][j] = new JButton();
                buttonArray[i][j].setText("Button");
                buttonArray[i][j].setBounds(50 + i * 120, 50 + j * 50, 100, 40);
                add(buttonArray[i][j]);
 
                buttonArray[i][j].addActionListener(new ActionListener() {
 
                    @Override
                    public void actionPerformed(ActionEvent e) {
 
                        JButton b = (JButton) e.getSource();
                        Point p = b.getLocation();
                        
                        lbl: for (int i = 0; i < 5; i++) {
                            for (int j = 0; j < 5; j++) {
                                if (p.equals(buttonArray[i][j].getLocation())) {
                                    System.out.println("button ["+i+"]["+j+"] pressed");
                                    break lbl;
                                }
                            }
                        }
 
                    }
                });
            }
        }
        setVisible(true);
    }
 
    public static void main(String[] args) {
        OwnButton w = new OwnButton();
    }
}
первый пример некорректно отрисовывал кнопки, надо было просто окошко чуть-чуть растянуть - делал на скорую руку
переделал немного без наследования
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,977
08.08.2013, 17:40
Совсем немного свой пример изменил:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package easybudda.examples.buttoncoordinates;
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
public class ButtonCoordinates {
    private final int ROWS = 4;
    private final int COLUMNS = 5;
    
    private JLabel infoLabel;
    private JButton [] buttons;
    
    public ButtonCoordinates() {
        infoLabel = new JLabel("Push some button");
        
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                JButton button = (JButton)(ae.getSource());
 
                for ( int i = 0; i < buttons.length; ++i ) {
                    if ( buttons[i] == button ) {
                        infoLabel.setText("Row: " + ( i / COLUMNS + 1 ) + " Column: " + ( i % COLUMNS + 1 ));
                        break;
                    }
                }
            }
        };
        
        buttons = new JButton [ ROWS * COLUMNS ];
        for ( int i = 0; i < buttons.length; ++i ) {
            buttons[i] = new JButton(String.valueOf(i));
            buttons[i].addActionListener(listener);
        }
        
        JFrame frmMain = new JFrame("Button coordinates");
        frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frmMain.setLayout(new BorderLayout());
        
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.setLayout(new GridLayout(ROWS, COLUMNS));
        for ( JButton b : buttons )
            buttonsPanel.add(b);
        
        frmMain.add(buttonsPanel, BorderLayout.CENTER);
        frmMain.add(infoLabel, BorderLayout.SOUTH);
        
        frmMain.pack();
        frmMain.setVisible(true);
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new ButtonCoordinates();
            }
        });
    }
}
1
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
08.08.2013, 17:58
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
class Buttons extends JButton {
    public final int aXPos;
    public final int aYPos;
 
    Buttons(int xPos, int yPos) {
        aXPos = xPos;
        aYPos = yPos;
        this.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evnt) {
                System.out.println(aXPos + "  " + aYPos);
            }
        });
    }
}
 
public class Test extends JFrame {
 
    private Buttons[][] playerField;
    private JPanel player;
    private JPanel button;
    private JButton enabler;
 
    Test() {
        initFrame();
    }
 
    void initFrame() {
        setSize(400, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        button = new JPanel();
        enabler = new JButton("Enable buttons");
        button.add(enabler);
        enabler.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                for(int i = 0; i < 10; i++) {
                    for(int j = 0; j < 10; j++) {
                        playerField[i][j].setEnabled(true);                 
                    }
                }
                getCoord(playerField);
            }
        });
        add(button, BorderLayout.SOUTH);
        setVisible(true);
        initField();
    }
    
    void initField() {
        player = new JPanel();
        playerField = new Buttons[10][10];
        player.setLayout(new GridLayout(10, 10));
        for(int i = 0; i < 10; i++) {
            for(int j = 0; j < 10; j++) {
                playerField[i][j] = new Buttons(i, j);
                player.add(playerField[i][j]);
                playerField[i][j].setEnabled(false);
            }
        }
        add(player, BorderLayout.CENTER);
    }
     
    void getCoord(Buttons[][] work) {
        for(int i = 0; i < 10; i++) {
            for(int j = 0; j < 10; j++) {
                work[i][j] = new Buttons(i, j);
                player.add(work[i][j]);
            }
        }
    }
    
    public static void main(String[] args) {
        new Test();
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2013, 17:58
Помогаю со студенческими работами здесь

Проверка нажатой кнопки
Составить схему подсоединение к микроконтроллера 8051 в программной среде Multisim. Написать программу на языке ассемблера, которая выводит...

Перехват нажатой кнопки
Здравствуйте, подскажите, как сделать так, что бы программа перехватывала нажатия кнопки постоянно и когда форма не активна. Через...

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

Определение нажатой кнопки
Здравствуйте! Делаю программку в MVS 2019 с помощью MFC. У меня создан диалог, на котором находится большое количество кнопок. Все кнопки...

Name нажатой кнопки в TEdit
Есть несколько кнопок Button. При нажатии на одну из них в Edit должно помещаться Name нажатого Button`а. Был бы рад, если бы вы сказали...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru