Форум программистов, компьютерный форум, киберфорум
Java: GUI, Графика
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 15.12.2020
Сообщений: 1
1

Морской бой на Java (первый раз, всё очень плохо)

15.12.2020, 06:33. Просмотров 1942. Ответов 1

Доброго времени суток! Первая практика на Java, пока была знакома с ней только теоретически (пишу в надежде, что сильно смеяться не будете), преподаватель дал задание сотворить "Морской бой". В процессе создания первого поля мне, честно говоря, не пришло в голову ничего лучше, как создать массив кнопок (100 шт), мол, при нажатии на них будет меняться картинка (с пустой на кнопку с кораблём).
И при конкретном выборе кнопки никаких проблем не возникает (т.е. при нажатии на кнопку картинка меняется, как и должно быть при построении поля)
Java
1
2
3
4
5
6
myMap[1].addActionListener(new ActionListener() {          //myMap - массив кнопок
                    @Override
                    public void actionPerformed(ActionEvent actionEvent) {
                        Panel.enemyMap[1].setIcon(new ImageIcon("https://www.cyberforum.ru/images/ship.png"));
                    }
                });
Но проблема в том, что кнопок у меня 100, и я не могу вручную им всем прописать это условие. Соответственно я попыталась через массив, прямо где объявляла его (да и потом в отдельном на всякий).
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
for(int x = 1; x<=10; x++){           
            for (int y=1; y<=10; y++){
                myMap[(x-1) * 10 + y] = new JButton();
                myMap[(x-1) * 10 + y].setBounds(80 + 40 * (x-1), 40 * y + 10, 40, 40 );
                myMap[(x-1) * 10 + y].addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent actionEvent) {
                        myMap[(x-1) * 10 + y].setIcon(new ImageIcon("https://www.cyberforum.ru/images/ship.png"));
                    }
                });
                add(myMap[(x-1) * 10 + y]);
            }
        }
Собственно, Idea ругается и говорит следующее: Variable 'x' 'y' are accessed from within inner class, needs to be final or effectively final.
Вроде бы я понимаю о чем он, но тогда не особо понимаю, как вообще сделать, чтобы сразу все кнопки "ожидали" нажатия и меняли картинку по клику.
Если что, почти целый код класса с кнопками вот (тут немного другой способ ещё, он тоже не подошел, и вполне вероятно тут дофига лишних импортов, ибо я пробовала кучу способов из инета..):
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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
 
 
public class Panel extends JPanel {
 
    static JButton myMap[]=new JButton[101];
    static JButton enemyMap[]=new JButton[101];
    JButton bLength[]= new JButton[5];
 
    public Panel() {
 
        setLayout(null);
 
        for(int x = 1; x<=10; x++){             //делает пустое поле
            for (int y=1; y<=10; y++){
                myMap[(x-1) * 10 + y] = new JButton();
                myMap[(x-1) * 10 + y].addMouseListener(new MouseListener() {
                    @Override
                    public void mouseClicked(MouseEvent mouseEvent) {
                       myMap[(x-1) * 10 + y].setIcon(new ImageIcon("https://www.cyberforum.ru/images/ship.png"));
                    }
 
                    @Override
                    public void mousePressed(MouseEvent mouseEvent) {
 
                    }
 
                    @Override
                    public void mouseReleased(MouseEvent mouseEvent) {
 
                    }
 
                    @Override
                    public void mouseEntered(MouseEvent mouseEvent) {
 
                    }
 
                    @Override
                    public void mouseExited(MouseEvent mouseEvent) {
 
                    }
                });
                myMap[(x-1) * 10 + y].setBounds(80 + 40 * (x-1), 40 * y + 10, 40, 40 );
                add(myMap[(x-1) * 10 + y]);
            }
        }
    }
 
}
Была бы очень признательна, если бы кто-нибудь смог подсказать, как сделать так, чтобы все кнопки были в ожидании и при клике меняли картинку (опять же, если точечно каждую брать, то никаких проблем, но их с учетом второй таблицы будет 200..), ну или, если этот вариант вообще лажа, какой-то другой путь для создания квадратиков поля, которые при нажатии меняются.. Заранее большое спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2020, 06:33
Ответы с готовыми решениями:

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

Почему программисты на C++ и Java плохо относятся к C#?Ведь C# + .NET = очень удобный язык! Все упрощено! И достаточно быстро работают программы на C#
Очень интересно:)

Продам игры для курсовых/аттестационных работ на Java Script: классический морской бой, лабиринт
Продам игры для курсовых/аттестационных работ или просто на ваш сайт : классический морской бой с...

Исправить "Морской бой" на сокетах Java
Я уже очень долго не могу доделать эту игру... Помогите исправить... Пожалуйста... У меня не...

1
0 / 0 / 0
Регистрация: 11.12.2020
Сообщений: 2
17.12.2020, 17:55 2
Привет, совсем недавно была похожая проблема. Посмотри кусок кода из моей прораммы и обрати внимание на ту часть, где создаюся ActionListener для каждой кнопки (строки 10-15):

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
        for(int r=0;r<4;r++) {
            for(int c=0;c<3;c++) {
                //Initialize the button in the board array
                squares[r][c] = new JButton();
                squares[r][c].setOpaque(true);
                squares[r][c].setSize(200, 200);
                squares[r][c].setBorder(new LineBorder(Color.BLACK));
                squares[r][c].setBackground(Color.decode("#db9356"));
                squares[r][c].setFont(new Font("Dialog", Font.BOLD, 50));
                squares[r][c].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        JButton theButton = (JButton) e.getSource();
                        for(int r=0;r<4;r++) {
                            for(int c=0;c<3;c++) {
                        if(theButton == squares[r][c] & click == 1 & plate.list(squares[r][c].getText())){
                            plate.from(r, c, squares[r][c].getText());
                            click++;
                            System.out.println(click +" "+ r +""+ c +" "+ squares[r][c].getText());
                            break;
                            }
                        else if(theButton == squares[r][c] & click == 2 & plate.list(squares[r][c].getText())==false){
                            if(plate.to(r, c)){
                                click--;
                                System.out.println(click +" "+ r +""+ c +" "+ squares[r][c].getText());
                                update();
                                }
                            else{
                                click=1;
                                System.out.println("Wrong move!");
                                }
                            break;
                            }
                        else if(theButton == squares[r][c] & click == 2 & plate.list(squares[r][c].getText())){
                            click=1;
                            System.out.println("Wrong move!");
                            break;
                            }       
                        }
                    }
                    }
                });
                //add each square to the GUI panel
                board.add(squares[r][c]);
            }
        }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2020, 17:55

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

Очень все плохо
Такая проблема. Пришел ко мне друг, попросил чтобы я ему Джаилбрейк на ipone установил и...

"Морской бой" на Java
Добрый вечер, Пожалуйста, помогите с написанием программы &quot;Морской бой&quot; в виде Java Desktop...

Вывод множественных свойств инфоблока. Всё очень плохо
Добрый день! Сидел себе перепиливал вывод данных о продукции на сайте и тут пришла беда, откуда не...

Вопрос по НЧ запросам для прокаченного сайта - все очень плохо
&lt;p&gt;Есть старый хороший СДЛ сайт - тиц 180, pr4. В общем с субдоменами пол миллиона страниц в...

Очень плохо работают браузеры и все, что использует интернет на Windows 10
Всем привет. Переустановил винду, решил попробовать Windows 10. Установил Google Chrome, но он...

Первый раз с Java )
помогите собрать проект, написано что использовалась Java. До этого ни разу не сталкивался. Вроде...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.