Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
1

Обработка событий

23.10.2011, 22:59. Показов 2877. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В общем Пишу шахматы. Рисую доску. использую менджер компоновки GridLayout, и добавляю туда панель с изображением. Как мне определить по какой именно клетке шелкнул пользователь. Помогите написать обработичк событий так чтобы было известно куда было кликнуто.
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
import javax.imageio.ImageIO;
import javax.swing.*;
import java.io.*;
import java.awt.*;
 
 
public class PlayGrauound extends JFrame
{
    
    JFrame jmainFrame;
    JPanel JpanelBoard,JPClok,JPChat;
    GridLayout Gl=new GridLayout(8,8);
        public PlayGrauound()
    {
        
        jmainFrame=new JFrame();
        jmainFrame.setSize(900, 640);
        jmainFrame.setDefaultCloseOperation(jmainFrame.EXIT_ON_CLOSE);
    
        
        JpanelBoard=new JPanel(Gl);
        JpanelBoard.setOpaque(true);
        JpanelBoard.setSize(600, 600);
        for(int i=0;i<8;i++)
            for(int j=0;j<4;j++)
            {
                PicturePanel pp = new PicturePanel();
                PicturePanel pp1 = new PicturePanel();
        try
            {
                pp.setImage(ImageIO.read(new File("D:\\Универ\\5_семестер\\Java\\3_laba_java\\1.jpg")));
                pp1.setImage(ImageIO.read(new File("D:\\Универ\\5_семестер\\Java\\3_laba_java\\11.jpg")));
            }
        catch (IOException e)
            {
                e.printStackTrace();
            }
        if(i % 2==0)
            {
        JpanelBoard.add(pp1);
        JpanelBoard.add(pp);
            }
        else{
            JpanelBoard.add(pp);
            JpanelBoard.add(pp1);
        }
            }
        JPClok=new JPanel();
        
        
        jmainFrame.add(JpanelBoard);
        jmainFrame.add(JPClok);
        
        
        
        jmainFrame.setVisible(true);
        
        
        //JPClok.add(im);
        }
    
            
    public void paint(Graphics g)
    {       
        
            g.setColor(Color.BLACK);
            g.drawLine(1, 1,10,1);
    }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.10.2011, 22:59
Ответы с готовыми решениями:

Обработка событий
Добрый день. В ходе знакомства с java я добрался до обработки событий. Подскажите, пожалуйста, как...

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

Обработка событий клавиатуры
Доброе время суток. Столкнулся с проблемкой - никак не могу считать данные с клавиатуры. ЗЫ...

Обработка событий мыши
Всем доброго времени суток. У меня возник вопрос относительно обработки событий мыши. ...

8
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
24.10.2011, 05:35 2
Ну во первых, учитывая, что ваши элементы типа "PicturePanel" с именами pp и pp1 будут использоваться в дальнейшем, то ссылки на них нужно сохранять, хотя бы в массив, желательно двумерный или в какую-нибудь коллекцию. А так в цикле переменные pp и pp1 постоянно (на каждом шаге цикла) на новые объекты ссылаются, а ссылок на старые не остается. Можно, конечно из JpanelBoard методами getComponents() или getComponentAt(point p) вытаскивать эти панельки и уже им привязывать обработку.
Для начала рекомендую оформить создание доски так, что бы остались ссылки на все объекты-панельки "клеточки" доски.
1
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
24.10.2011, 21:40  [ТС] 3
Это все хорошо но как конкретно это сделать? сохраняем рр рр1 в масив. ТАк а даьлеш каки именнно привязть к ним сылки. Укозательй ведь нет в джаве.
0
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
25.10.2011, 09:52 4
Цитата Сообщение от Gerbasha Посмотреть сообщение
сохраняем рр рр1 в масив. ТАк а даьлеш каки именнно привязть к ним сылки.
Не надо ничего привязывать, само все привяжется.
Создай в классе поле:
Java
1
private PicturePanel[][] fields = new PicturePanel[8][8];
Потом там, где добавляешь pp и pp1 на JpanelBoard, сделай Fileds[i][j*2] = pp или Fileds[i][j*2+1] = pp1 (в зависимости от условия).
Далее можешь добавлять на эти панельки фигуры:
Java
1
Fields[1][5].add(объект фигурки);
1
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
26.10.2011, 01:32  [ТС] 5
Ну собственно все реализовал. Только вернемся к public void mouseClicked(java.awt.event.MouseEvent arg0). Как мне получить на какую клеточку я клацаю из PicturePanel[][] ?
0
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
26.10.2011, 21:57 6
Из PicturePanel[][] ссылки на клетки будешь брать, когда будешь описывать события, не зависящие от действий пользователя. А для обработки события mouseClicked есть несколько способов:
1. Для каждой панельки, нужно будет завести свой mouseAdapter, и у каждого описать метод mouseClicked по своему. (нужно будет описать минимум 64 метода).
2. Сделать внешний класс, реализующий интерфейс MouseListener, и в нем, в методе mouseClicked, можно делать обработку, в зависимости от источника события arg0.getSourse().
3. То же самое, что и второй, только не отдельным классом, а классом формы (самообработка), будет проще, останутся ссылки на все члены класса формы. (наиболее подходящее в случае с большим массивом источников события).
4. arg0.getPoint() вернет объект типа Point из которого можно узнать координаты курсора мыши при нажатии, и на основании них, определить куда ткнул пользователь. (муторно)

Это пока что на ум пришло, может быть есть и другие способы, гораздо легче.
0
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
26.10.2011, 23:50  [ТС] 7
Цитата Сообщение от _ViPeR_ Посмотреть сообщение
. То же самое, что и второй, только не отдельным классом, а классом формы (самообработка), будет проще, останутся ссылки на все члены класса формы. (наиболее подходящее в случае с большим массивом источников события).
До этого я и сам догодался не могу описать события mouseClicked иза того что НЕУМЕЮ этого делать. поэтому и спрашиваю.
0
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
27.10.2011, 08:44 8
Добавляешь к классу формы реализацию интерфейса MouseListener. Необходимо будет реализовать все методы этого интерфейса, среди которых будет mouseClicked.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class имя_класса_формы extends javax.swing.JFrame implements MouseListener {
...
    public void mouseClicked(MouseEvent e) {        
    }
    public void mousePressed(MouseEvent e) {        
    }
    public void mouseReleased(MouseEvent e) {        
    }
    public void mouseEntered(MouseEvent e) {        
    }
    public void mouseExited(MouseEvent e) {        
    }
...
}
Затем надо добавить слушателя к каждой панельке. Вот здесь то и понадобятся все ссылочки из массива:
Java
1
2
3
4
5
for (int i = 0; i < Fields[0].length; i++) {
            for (int j = 0; j < Fields.length; j++) {
                Fields[i][j].addMouseListener(this);
            }            
        }
Теперь класс формы сам будет прослушивать события мышки в панельках. В методе mouseClicked можешь делать все что угодно. Само событие клика в классе mouseClicked - e, в моем примере, в твоем arg0. Из этого объекта события можно вытащить источник:
Java
1
e.getSource()
или компонент
Java
1
e.getComponent()
1
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
27.10.2011, 14:13  [ТС] 9
Благодарю вышло) 2 недели мучений.
0
27.10.2011, 14:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2011, 14:13
Помогаю со студенческими работами здесь

Не работает обработка событий
В intellij IDEA с помощью UI master создал форму, добавил обработчик событий, но при нажатии на...

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

Обработка событий и метод paint()
Приветствую. Столкнулся с проблемой при обработке событий и использовании метода paint()...

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

Обработка событий на графическом интерфейсе
Всем доброго времени суток.Начинаю потихоньку въезжать в ГПИ. Наткнулся на статью в которой...

Назначение клавиш и обработка событий
package Menu; import java.awt.Dimension; import java.awt.Font; import...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru