0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 8

Координаты компонента при использовании менеджера компоновки

29.11.2013, 16:38. Показов 1655. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть фрейм. Часть его занимает некий компонент(extends JPanel, если важно). По некоторому событию нужно передать в этот компонент координаты мыши. При чём координаты относительно этого самого компонента. Т.е. начало отсчёта в левом верхнем углу панели, а не всего фрейма.
Вычитать координаты самой панели не получается - используются менеджеры компоновки и все размеры и координаты компонентов равны нулю.
Собственно, как получить координаты мыши относительно определённого компонента?

Добавлено через 5 минут
UPD. Пробовал вешать MouseMotionListener на компонент, но всё равно *задумался и ушел ещё кое-что проверить :-) *

Добавлено через 14 минут
Нет, MouseMotionListener тоже передаёт либо координаты относительно фрейма, либо (0, 0)...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.11.2013, 16:38
Ответы с готовыми решениями:

Ошибка компоновки при использовании MPIR
Добрый день. Имеется программа: #include <iostream> #include <string.h> #include <string> //#include <stdio.h> //#include...

Ошибка компоновки при использовании MPIR
Добрый день. При попытке скомпилировать код выдается ряд ошибок "LNK2005 error". В чем может быть дело? #include <iostream> ...

Ошибки компоновки LNK2028 и LNK2019 при использовании Windows.h
Взял код для графического интерфейса от сюда: https://www.cyberforum.ru/cpp-cli-winforms/thread1224010.html Создал кнопку, подключил...

10
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
29.11.2013, 16:44
Не совсем понятно - а где в этот момент находится курсор? На другом компоненте? Вообще за пределами окна?
0
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 8
29.11.2013, 16:52  [ТС]
Программа: морской бой. Сейчас занимаюсь размещением кораблей. Слева поле (подкласс JPanel), справа - корабли (Rectangle'ы, отрисовываются поверх форму вручную). Корабли перетаскиваются (dragged) мышкой. При отпускании мышки нужно передать её координаты панели.

Попытался сделать два MouseMotionListener'а - один для панели (обновляет координаты внутри компонента), другой - для всего фрейма (отвечает за само перетаскивание кораблей).

Надеюсь, более-менее понятно, извиняюсь, что сразу не объяснил сути
0
 Аватар для Skipy
2000 / 1427 / 92
Регистрация: 25.11.2010
Сообщений: 3,611
29.11.2013, 19:33
И где код? Описанная схема должна работать.
0
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 8
29.11.2013, 19:58  [ТС]
Listener поля:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
    private class FieldMouseHandler extends MouseMotionAdapter {
        
        public void mouseMoved(MouseEvent e) {
            handler.setFieldXPos(e.getX());
            handler.setFieldYPos(e.getY());
            System.out.println("mouseMoved");
        }
    }


Listener фрейма:
Кликните здесь для просмотра всего текста
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
    private class MouseHandler implements MouseListener, MouseMotionListener {
        
        private Ship curShip;
        
        private int fieldXPos = 0;
        private int fieldYPos = 0;
        
        
        public void mouseClicked(MouseEvent e) {
        }
 
        public void mouseDragged(MouseEvent e) {
            if(curShip != null) {
                if(true) {
                    curShip.moveLocation(e.getPoint());
                    repaint();
                }
            }
            System.out.println("mouseDragged");
        }
 
        public void mouseMoved(MouseEvent e) {
        }
 
        public void mouseEntered(MouseEvent e) {
        }
 
        public void mouseExited(MouseEvent e) {
        }
 
        public void mousePressed(MouseEvent e) {
            Ship ship = find(e.getPoint());
            if(ship != null) {
                curShip = ship;
            }
        }
 
        public void mouseReleased(MouseEvent e) {
            if(curShip != null) {
                field.addShip(curShip, fieldXPos, fieldYPos);
                ships.remove(curShip);
                curShip = null;
                repaint();
            }
        }
        
        private Ship find(Point p) {
            for(Ship s : ships) {
                if(s.contains(p)) {
                    return s;
                }
            }
            
            return null;
        }
 
        public void setFieldXPos(int fieldXPos) {
            this.fieldXPos = fieldXPos;
        }
 
        public void setFieldYPos(int fieldYPos) {
            this.fieldYPos = fieldYPos;
        }   
        
    }


И весь файл, чтоб два раза не бегать
Кликните здесь для просмотра всего текста
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
package window.panels;
 
import java.awt.BorderLayout;
 
public class MainPanel extends JPanel {
 
    private MouseHandler handler;
    private ArrayList<Ship> ships;
    private Field field;
    
    private JLabel lblRightPlayer;
    private JLabel lblRightStatus;
    private JLabel lblLeftStatus;
    private JLabel lblLeftPlayer;
    
    private JPanel pnl4decker;
    private JPanel pnl3decker;
    private JPanel pnl2decker;
    private JPanel pnl1decker;
    
    private JLabel lbl4Count;
    private JLabel lbl3Count;
    private JLabel lbl2Count;
    private JLabel lbl1Count;
 
    public MainPanel() {
        setSize(Const.MainFrameWidth, Const.MainFrameHeight);
        setMinimumSize(getSize());
        setMaximumSize(getSize());
        
        setBackground(Const.FrameBackgroudColor);
        setLayout(new BorderLayout(0, 0));
        
        JPanel pnlBoth = new JPanel();
        pnlBoth.setOpaque(false);
        add(pnlBoth);
        pnlBoth.setLayout(new BoxLayout(pnlBoth, BoxLayout.X_AXIS));
        
        JPanel pnlLeft = new JPanel();
        pnlBoth.add(pnlLeft);
        pnlLeft.setBorder(new MatteBorder(2, 2, 2, 5, new Color(65, 105, 225)));
        pnlLeft.setOpaque(false);
        pnlLeft.setLayout(new BorderLayout(0, 0));
        
        JPanel pnlLeftStatus = new JPanel();
        pnlLeftStatus.setBorder(new MatteBorder(0, 0, 1, 0, new Color(0, 0, 255)));
        pnlLeftStatus.setOpaque(false);
        pnlLeft.add(pnlLeftStatus, BorderLayout.NORTH);
        pnlLeftStatus.setLayout(new BoxLayout(pnlLeftStatus, BoxLayout.X_AXIS));
        
        lblLeftPlayer = new JLabel("Player1");
        lblLeftPlayer.setForeground(Const.LabelColor);
        lblLeftPlayer.setFont(Const.LabelFont);
        pnlLeftStatus.add(lblLeftPlayer);
        
        Component horizontalGlue = Box.createHorizontalGlue();
        pnlLeftStatus.add(horizontalGlue);
        
        lblLeftStatus = new JLabel("");
        lblLeftStatus.setForeground(Const.LabelColor);
        lblLeftStatus.setFont(Const.LabelFont);
        pnlLeftStatus.add(lblLeftStatus);
        
        JPanel pnlLeftField = new JPanel();
        pnlLeftField.setOpaque(false);
        pnlLeft.add(pnlLeftField, BorderLayout.CENTER);
        
        JPanel pnlRight = new JPanel();
        pnlBoth.add(pnlRight);
        pnlRight.setBorder(new MatteBorder(2, 5, 2, 2, new Color(65, 105, 225)));
        pnlRight.setOpaque(false);
        pnlRight.setLayout(new BorderLayout(0, 0));
        
        JPanel pnlRightStatus = new JPanel();
        pnlRightStatus.setBorder(new MatteBorder(0, 0, 1, 0, new Color(0, 0, 255)));
        pnlRightStatus.setOpaque(false);
        pnlRight.add(pnlRightStatus, BorderLayout.NORTH);
        pnlRightStatus.setLayout(new BoxLayout(pnlRightStatus, BoxLayout.X_AXIS));
        
        lblRightStatus = new JLabel("");
        lblRightStatus.setForeground(Const.LabelColor);
        lblRightStatus.setFont(Const.LabelFont);
        pnlRightStatus.add(lblRightStatus);
        
        Component horizontalGlue_1 = Box.createHorizontalGlue();
        pnlRightStatus.add(horizontalGlue_1);
        
        lblRightPlayer = new JLabel("Player2");
        lblRightPlayer.setForeground(Const.LabelColor);
        lblRightPlayer.setFont(Const.LabelFont);
        pnlRightStatus.add(lblRightPlayer);
        
        JPanel pnlShips = new JPanel();
        pnlShips.setOpaque(false);
        pnlRight.add(pnlShips, BorderLayout.CENTER);
        pnlShips.setLayout(new BoxLayout(pnlShips, BoxLayout.Y_AXIS));
        
        JPanel pnlShipsList = new JPanel();
        pnlShipsList.setOpaque(false);
        pnlShips.add(pnlShipsList);
        pnlShipsList.setLayout(new GridLayout(2, 2, 0, 0));
        
        pnl4decker = new JPanel();
        pnl4decker.setOpaque(false);
        pnlShipsList.add(pnl4decker);
        pnl4decker.setLayout(new BorderLayout(0, 0));
        
        lbl4Count = new JLabel("0");
        lbl4Count.setFocusable(false);
        lbl4Count.setBorder(new MatteBorder(0, 0, 1, 1, (Color) new Color(0, 0, 255)));
        lbl4Count.setForeground(new Color(220, 20, 60));
        lbl4Count.setFont(Const.LabelFont);
        lbl4Count.setHorizontalAlignment(SwingConstants.CENTER);
        pnl4decker.add(lbl4Count, BorderLayout.CENTER);
        
        pnl3decker = new JPanel();
        pnl3decker.setOpaque(false);
        pnlShipsList.add(pnl3decker);
        pnl3decker.setLayout(new BorderLayout(0, 0));
        
        lbl3Count = new JLabel("0");
        lbl3Count.setFocusable(false);
        lbl3Count.setBorder(new MatteBorder(0, 0, 1, 0, (Color) new Color(0, 0, 255)));
        lbl3Count.setForeground(new Color(220, 20, 60));
        lbl3Count.setFont(Const.LabelFont);
        lbl3Count.setHorizontalAlignment(SwingConstants.CENTER);
        pnl3decker.add(lbl3Count, BorderLayout.CENTER);
        
        pnl2decker = new JPanel();
        pnl2decker.setOpaque(false);
        pnlShipsList.add(pnl2decker);
        pnl2decker.setLayout(new BorderLayout(0, 0));
        
        lbl2Count = new JLabel("0");
        lbl2Count.setFocusable(false);
        lbl2Count.setBorder(new MatteBorder(0, 0, 1, 1, (Color) new Color(0, 0, 255)));
        lbl2Count.setForeground(new Color(220, 20, 60));
        lbl2Count.setFont(Const.LabelFont);
        lbl2Count.setHorizontalAlignment(SwingConstants.CENTER);
        pnl2decker.add(lbl2Count, BorderLayout.CENTER);
        
        pnl1decker = new JPanel();
        pnl1decker.setOpaque(false);
        pnlShipsList.add(pnl1decker);
        pnl1decker.setLayout(new BorderLayout(0, 0));
        
        lbl1Count = new JLabel("0");
        lbl1Count.setFocusable(false);
        lbl1Count.setBorder(new MatteBorder(0, 0, 1, 0, (Color) new Color(0, 0, 255)));
        lbl1Count.setForeground(new Color(220, 20, 60));
        lbl1Count.setFont(Const.LabelFont);
        lbl1Count.setHorizontalAlignment(SwingConstants.CENTER);
        pnl1decker.add(lbl1Count, BorderLayout.CENTER);
        
        JPanel pnlButtons = new JPanel();
        pnlButtons.setOpaque(false);
        pnlShips.add(pnlButtons);
        pnlButtons.setLayout(new BoxLayout(pnlButtons, BoxLayout.X_AXIS));
        
        JButton btnReady = new JButton("Ready!");
        btnReady.setFocusable(false);
        btnReady.setBackground(Const.ButtonBackground);
        btnReady.setFont(Const.LabelFont);
        btnReady.setForeground(Const.LabelColor);
        pnlButtons.add(btnReady);
        
        JPanel pnlMessage = new JPanel();
        pnlMessage.setBackground(Const.MessageBackground);
        add(pnlMessage, BorderLayout.SOUTH);
        pnlMessage.setLayout(new BorderLayout(0, 0));
        
        JLabel lblMessage = new JLabel("Move ships from right side on field.");
        lblMessage.setHorizontalAlignment(SwingConstants.CENTER);
        lblMessage.setForeground(Const.LabelColor);
        lblMessage.setFont(Const.MessageFont);
        pnlMessage.add(lblMessage, BorderLayout.CENTER);
        
        ships = new ArrayList<Ship>(Const.ShipCount);
        for(int i = 0; i < Const.ShipCount; ++i) {
            Ship ship = new Ship(Const.ShipSizes[i], Const.ShipInitialCoords[Const.ShipSizes[i] - 1], true);
            ships.add(i, ship);
            
            JLabel counter = null;
            switch (Const.ShipSizes[i]) {
            case 4: {
                counter = lbl4Count;
                break;
            }
            case 3: {
                counter = lbl3Count;
                break;
            }
            case 2: {
                counter = lbl2Count;
                break;
            }
            case 1: {
                counter = lbl1Count;
                break;
            }
            }
            counter.setText(String.valueOf((Integer.parseInt(counter.getText()) + 1)));
        }
        
        handler = new MouseHandler();
        this.addMouseListener(handler);
        this.addMouseMotionListener(handler);
        pnlLeftField.setLayout(new BorderLayout(0, 0));
        
        field = new Field();
        field.setOpaque(false);
        pnlLeftField.add(field);
        field.addMouseMotionListener(new FieldMouseHandler());
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        
        for(Ship ship : ships) {
            ship.draw(g);
        }       
    }
 
    private class FieldMouseHandler extends MouseMotionAdapter {
        
        public void mouseMoved(MouseEvent e) {
            handler.setFieldXPos(e.getX());
            handler.setFieldYPos(e.getY());
            System.out.println("mouseMoved");
        }
    }
 
    private class MouseHandler implements MouseListener, MouseMotionListener {
        
        private Ship curShip;
        
        private int fieldXPos = 0;
        private int fieldYPos = 0;
        
        
        public void mouseClicked(MouseEvent e) {
        }
 
        public void mouseDragged(MouseEvent e) {
            if(curShip != null) {
                if(true) {
                    curShip.moveLocation(e.getPoint());
                    repaint();
                }
            }
            System.out.println("mouseDragged");
        }
 
        public void mouseMoved(MouseEvent e) {
        }
 
        public void mouseEntered(MouseEvent e) {
        }
 
        public void mouseExited(MouseEvent e) {
        }
 
        public void mousePressed(MouseEvent e) {
            Ship ship = find(e.getPoint());
            if(ship != null) {
                curShip = ship;
            }
        }
 
        public void mouseReleased(MouseEvent e) {
            if(curShip != null) {
                field.addShip(curShip, fieldXPos, fieldYPos);
                ships.remove(curShip);
                curShip = null;
                repaint();
            }
        }
        
        private Ship find(Point p) {
            for(Ship s : ships) {
                if(s.contains(p)) {
                    return s;
                }
            }
            
            return null;
        }
 
        public void setFieldXPos(int fieldXPos) {
            this.fieldXPos = fieldXPos;
        }
 
        public void setFieldYPos(int fieldYPos) {
            this.fieldYPos = fieldYPos;
        }   
        
    }


Но событие mouseMoved из поля не вызывается, когда пользователь перетаскивает корабль. Если просто водить мышью над полем, в консоли есть сообщения из этого метода. А при перетаскивании - только mouseDragged.
0
21 / 19 / 4
Регистрация: 05.06.2013
Сообщений: 190
30.11.2013, 06:49
Цитата Сообщение от Vlad_Lastname Посмотреть сообщение
if(true) {
.
Возможно curShip = null.
0
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 8
30.11.2013, 10:57  [ТС]
Это я собирался сделать перетаскивание только левой кнопкой мыши, но ещё не разбирался как и оставил просто бессмысленное условие) А curShip проверяется на null строчкой выше.

В общем, я пока сделал весьма костыльное решение:
1) В mouseMoved вычитаем из координат относительно экрана (getXOnScreen()) координаты относительно поля (getX()) - получаем координаты левого верхнего угла поля относительно экрана.
2) При перетаскивании вычитаем из координат мыши на экране координаты поля - получаем координаты мыши относительно поля.

Это для обхода всё той же проблемы - события mouseMoved и mouseDragged не обрабатываются одновременно.
0
21 / 19 / 4
Регистрация: 05.06.2013
Сообщений: 190
30.11.2013, 18:19
И в чём сейчас проблема.

Добавлено через 46 минут
Всё понял сори за бред. Если я правильно понял, для работы dragging нужен MouseMotionListener. Зачем вы его использовали?
0
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 8
30.11.2013, 21:40  [ТС]
В смысле зачем? Для перетаскивания корабликов
0
21 / 19 / 4
Регистрация: 05.06.2013
Сообщений: 190
30.11.2013, 21:50
А draggera зачем?
0
0 / 0 / 0
Регистрация: 05.10.2013
Сообщений: 8
01.12.2013, 10:56  [ТС]
При перетаскивании (перемещении мыши с зажатой клавишей) срабатывает именно mouseDragged(). В том то и проблема, что mouseMoved так не работает, иначе можно было бы все действия в нём прописать. Т.е. если просто водить мышкой по компоненту, то работает mouseMoved, а если всё то же самое, но при этом задержав кнопку мыши, то mouseDragged. Я рассчитывал, что во втором случае будут оба события работать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.12.2013, 10:56
Помогаю со студенческими работами здесь

Расположение компонентов. Менеджера компоновки GridBagLayout
Хочу основательно разобраться с таким новым для меня понятием как менеджер компоновки. Пока читаю всяческую литературу - всё понятно. Чтобы...

При использовании компонента RadioGroup
Мне нужно что бы было 2 переключателя на выбор (мужской женский) Написал вроде все норм,но почему то когда вывожу в StringGrid он вместо...

Ошибка подключения к БД при использовании WPF-компонента
Всем привет! Возникла такая проблема: Есть некоторый wpf-компонент, который использует подключение к БД. Я пытаюсь его использовать и...

Ошибка при использовании компонента Database Form Wizard
Создал базу данных, через Data Base Desktop, сохранил создал форму, после этого хочу поместить на форму базу данных используя Database...

Как установить размера пинга при использовании компонента INDY IdIcmpClient ревизия №6
Подскажите как задать размер пакета в байтах, читал на сторонних форумах, народ ссылается на значение DEF_PACKET_SIZE это константа...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Динамические массивы в C++ - создание и использование
NullReferenced 27.04.2025
Динамические массивы представляют собой один из фундаментальных инструментов программирования на C++, позволяющий создавать структуры данных, размер которых определяется во время выполнения. . .
Асинхронный JavaScript: Промисы, Async/Await и Fetch API
Reangularity 27.04.2025
Пользователь заходит на веб-страницу, нажимает кнопку и. . . ничего не происходит. Сайт словно замер. Через несколько секунд всё внезапно оживает, но пользователь уже успел закрыть вкладку. Знакомая. . .
Management on GitLab and repository management in Visual Studio code
jigi33 27.04.2025
- repo management on GitLab - CI/ CD in GitLab - VCS repository management in Visual Studio code (see attachments)
Kanban или Scrum - что выбрать?
EggHead 27.04.2025
Kanban и Scrum — уже много лет удерживают лидирующие позиции среди гибких подходов. Руководители проектов и команды разработчиков то и дело сталкиваются с дилеммой: какой из этих двух методов выбрать. . .
Кастомные Middleware на C# в ASP.NET Core
UnmanagedCoder 27.04.2025
Разработка веб-приложений сегодня мало напоминает монолитное программирование прошлых лет. На смену громоздким блокам кода пришла модульная архитектура, где каждый компонент выполняет строго. . .
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru