Форум программистов, компьютерный форум, киберфорум
Java: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/46: Рейтинг темы: голосов - 46, средняя оценка - 4.65
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173

Разработка графического оконного интерфейса

29.11.2013, 17:50. Показов 9832. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
У меня проблемма с программой состоящая из 2-х частей. Немного запутался как это реализовать. Может у кого-то есть подобный код? Просто хотелось бы понять как это написать.
По сути нужно с помощью пакета Swing реализовать 2-ве задачи:
№1
1. Создать окно входа в систему. Окно должно содержать:
- текстовые поля для ввода логина и пароля с подписями (введенный пароль не должен быть виден);
- кнопки "Войти", "Регистрация" и "Отмена".
Окно должно соответствовать стандартам расположении элементов управления.
При выборе "Отмена" работа приложения завершается.
При выборе "Войти" выполняется проверка правильности логина и пароля и выдается сообщение о результате проверки.
При выборе "Регистрация" окно переходит в режим регистрации нового пользователя (изменяется заголовок окна, появляется новое поле для подтверждения пароля, скрывается кнопка "Войти").
Для хранения логинов и паролей в памяти использовать HashMap. Реализовать сериализацию этих данных в файл на диске.


№2
2. Создать приложение с оконным интерфейсом. Игра "Сапер". Правила игры аналогичны стандартной игре Windows. Использовать игровое поле 5*5. В окне должна быть текстовая надпись, сообщающая, сколько "мин" осталось не найдено. После каждого хода программа должна автоматически определять, завершена ли игра и выиграл ли игрок.
В качестве ячеек использовать кнопки с картинками. В файл сохранять текущее состояние игры.
Окно приложения должно содержать меню и панель инструментов. Все действия должны выполняться несколькими способами: через меню, кнопки панели инструментов, горячие клавиши.
Реализовать сохранение данных приложения в текстовый .CSV-файл и загрузку из файла.
Перечень обязательных пунктов меню:
- File: New, Open, Save, Save as, Exit;
- Help: About.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.11.2013, 17:50
Ответы с готовыми решениями:

Неправильное отображение элементов графического интерфейса
Доброго времени суток. Недавно начал изучать Java. Скачал пакет Eclips Luna со всем необходимым. Делаю первые шаги, но уже столкнулся с...

Обновление графического интерфейса всей программы на Java
У меня есть несколько классов, к примеру MainClass - он отвечает за создание главного JFrame, JMenuBar и JToolBar, потом класс Table...

Выбор дизайнера для создания графического интерфейса
Здравствуйте! Что лучше выбрать при разработке интерефейсов? Т.е. какой дизайнер. Попробовал руками добавлять компоненты, это очень...

16
21 / 19 / 4
Регистрация: 05.06.2013
Сообщений: 190
29.11.2013, 22:33
Вопросы желательно задавать по одному. У вас перебор гуглящихся вопросов. http://javaswing.wordpress.com/ Посмотрите здесь, что не найдёте или будет не понятно пишите.
0
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
29.11.2013, 23:58  [ТС]
Ну по сути это одна прога разбитая на 2-ве части.
0
21 / 19 / 4
Регистрация: 05.06.2013
Сообщений: 190
30.11.2013, 06:45
Советую вам разобраться в swing, а потом прийти за тем, что не нашли.
0
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
30.11.2013, 11:55  [ТС]
ОК Я почитаю swing и потом напишу свои наброски.
0
21 / 19 / 4
Регистрация: 05.06.2013
Сообщений: 190
30.11.2013, 19:09
Жду.

Добавлено через 1 час 37 минут
Как успехи?
0
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
30.11.2013, 21:57  [ТС]
Нужно еще время. Через некоторое время сообщу. Возможно завтра, или где-то на следующей недели. Я только начал изучать java, поэтому очень нескоро разберусь. А еще со swing впервые начал изучать, до этого делал только консольные приложения. Пока все непревычно.
0
21 / 19 / 4
Регистрация: 05.06.2013
Сообщений: 190
30.11.2013, 22:05
Сам swing прост, но уныл и не робит.
0
01.12.2013, 07:33

Не по теме:

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

0
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
10.12.2013, 17:30  [ТС]
По первому заданию, создал форму с вводом логина и пароля, но не знаю как запустить. Что в public void main написать? А регистрации пока нету, не разобрался как реализовать, но пароли сохраняются после ввода. Как доделать, чтобы было как в задании?

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
package ua.vladaxon;
 
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
 
/**
 * Класс диалогового окна входа в систему.<br>
 * Экземпляр класса создается 1 раз.<br>
 * @author Sied
 * @see Elector
 */
public class Login extends JDialog{
    
    private static final long serialVersionUID = 1L;
    private static Login instance = null;
 
    /**Поле ввода логина*/
    private JTextField login=null;
    /**Поле ввода пароля.<br> {@link JPasswordField} не используется специально.<br>*/
    private JTextField password=null;
    /**Строковое значение введенного логина*/
    private String tlogin=null;
    /**Строковое значение введенного пароля*/
    private String tpassword=null;
    /**Состояние завершения диалога*/
    private boolean approved=false;
    /**Кнопка подтверждения ввода*/
    private JButton ok=null;
    /**Фрейм, использующийся для отображения на панели задач*/
    private JFrame taskbar=null;
    
    /**Константа поля логин, отображается до получения фокуса полем ввода логина.*/
    private static final String deflogintext="login";
    /**Константа поля пароль, отображается до получения фокуса полем ввода пароля*/
    private static final String defpasswordtext="password";
    
    /**
     * Конструктор диалогового окна логина.<br>
     * Создается интерфейс диалогового окна, затем вызывается методом <b>showDialog</b>.<br>
     * @param owner Фрейм-владелец диалогового окна.<br>
     */
    private Login(JFrame owner){
        super(owner,true);
        this.setVisible(false);
        ok = new JButton("Ok");
        ok.setToolTipText("Введите логин и пароль для входа в систему");
        JButton exit = new JButton("Exit");
        exit.setToolTipText("Нажмите на кнопку, если хотите выйти из программы");
        login = new JTextField(deflogintext);
        login.addFocusListener(new FocusAdapter() {
            //При получении фокуса стирает запись по умолчанию
            @Override
            public void focusGained(FocusEvent e) {
                super.focusGained(e);
                JTextField item = (JTextField)e.getSource();
                if(item.getText().equals(deflogintext)){
                    item.setForeground(Color.BLACK);
                    item.setText("");           
                }
        }});
        password = new JTextField(defpasswordtext);
        password.addFocusListener(new FocusAdapter() {
            //При получении фокуса стирает запись по умолчанию
            @Override
            public void focusGained(FocusEvent e) {
                super.focusGained(e);
                JTextField item = (JTextField)e.getSource();
                if(item.getText().equals(defpasswordtext)){
                    item.setForeground(Color.BLACK);
                    item.setText("");
                }
        }});
        this.setTitle("Login");
        JPanel loginpanel = new JPanel();
        loginpanel.setLayout(new GridLayout(3,2));
        loginpanel.add(new JLabel("Login:"));
        loginpanel.add(login);
        loginpanel.add(new JLabel("Password:"));
        loginpanel.add(password);
        loginpanel.add(ok);
        loginpanel.add(exit);
        this.setContentPane(loginpanel);
        this.setResizable(false);
        this.setSize(200,100);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowActivated(WindowEvent e) {
                super.windowActivated(e);
                ok.requestFocusInWindow();//После открытия передать фокус кнопке ОК
        }});
        ok.addActionListener(new Approve());
        exit.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                System.exit(0);
        }});
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                System.exit(0);
        }});
        taskbar = new JFrame(this.getTitle());//Для панели задач
        taskbar.setSize(0,0);
        taskbar.setUndecorated(true);
    }
    
    /**
     * Метод отображения диалогового окна логина.<br>
     * Сбрасывает поля ввода и положение окна, отображает фрейм для панели управления.<br>
     * @param owner Фрейм-владелец диалогового окна.<br>
     * @return Статус завершения диалога.<br>
     */
    public static boolean showDialog(JFrame owner){
        if(instance==null)
            instance = new Login(owner);
        instance.approved=false;
        instance.setLocationRelativeTo(null);
        instance.login.setForeground(Color.GRAY);
        instance.password.setForeground(Color.GRAY);
        instance.login.setText(deflogintext);
        instance.password.setText(defpasswordtext);
        instance.taskbar.setVisible(true);
        instance.setVisible(true);
        instance.taskbar.setVisible(false);
        if(!instance.approved){
            instance.tlogin="";
            instance.tpassword="";
        }
        return instance.approved;
    }
    
    /**
     * Возвращает последний введенный логин.<br>
     * @return Строковое значение логина.<br>
     */
    public static String getTypedLogin(){
        return instance.tlogin;
    }
    
    /**
     * Возвращает последний введенный пароль.<br>
     * @return Строковое значение пароля.<br>
     */
    public static String getTypedPassword(){
        return instance.tpassword;
    }
    
    /**
     * Класс слушатель кнопки подтверждения входа.<br>
     * Проверяет поля ввода и если они не пустые - завершает диалог.<br>
     * Проверка пользователя осуществляется в {@link VotingSystem}.<br>
     * @author Sied
     * @see Login
     */
    class Approve implements ActionListener{
        public void actionPerformed(ActionEvent e){
            if(!(login.getText().equals("") || password.getText().equals(""))){
                approved=true;
                tlogin=login.getText();
                tpassword=password.getText();
                Login.instance.setVisible(false);
            } else {
                JOptionPane.showMessageDialog(instance, "Вы не ввели логин или пароль.");
            }
    }}
    
}
0
 Аватар для lpvoid
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
10.12.2013, 17:40
SAZl,
Java
1
2
3
4
5
6
7
8
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Login();
        }
    }
}
1
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
10.12.2013, 18:27  [ТС]
Java
1
SwingUtilities.invokeLater(new Runnable() {
Так и должно быть? В конце нету скобки. А то среда ругается на 3-ю { фигурную скобку в коде и говорит, что нехвадает "(" или ";". Пробовал везде добавлять, или удалять не получилось убрать ошибку. Пока не увидел, что нету скобки в Runnable. Но добавление ее не помогло.

Добавлено через 3 минуты
А нашел.

Добавлено через 7 минут
А вот эта конструкция точно правильно написана: new Login();

Добавлено через 53 секунды
5 срока.
0
 Аватар для lpvoid
324 / 307 / 59
Регистрация: 06.03.2013
Сообщений: 869
10.12.2013, 18:35
SAZl, неправильно написал - так надо:
Java
1
2
3
4
5
6
7
8
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Login();
        }
    });
}
0
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
10.12.2013, 19:50  [ТС]
Я же писал ранее, что нашел где нужно было поставить скобку и точку с запятой. Но теперь среда указала на 5-ю строку. Там правильно написано?

Добавлено через 27 минут
Походу надо так:
Java
1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
 
создаем ОТДЕЛЬНЫЙ ПОТОК(отдельный процесс)
 
public void run() {
new Login();
        }
    });
}
Но какой поток?

Добавлено через 37 минут
Пока ничего не получилось!
0
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
11.12.2013, 21:57  [ТС]
А как сделать регистрацию?

Добавлено через 1 час 51 минуту
0
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
14.12.2013, 15:50  [ТС]
Походу никто так и не разъяснит ситуацию, жаль

Добавлено через 57 секунд
Ладно тогда по второму заданию. Вот код:
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
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
import java.awt.AWTEvent;
 
public class MineSweeper extends JPanel implements AWTEventListener, ActionListener {
 
  public static enum State {
    Clicked, Marked, Initial, WrongMarked
  }
 
  public static enum GameState {
    NotStarted, Playing, Finished
  }
 
  private static final int  MAX_BOMB_COUNT  = 10;
  private int          ROWS      = 9, COLUMNS = 9, TOTAL = ROWS * COLUMNS;
  private JPanel        pnlMain      = new JPanel(new GridLayout(ROWS, COLUMNS));
  private JLabel        lblBombCount  = new JLabel(MAX_BOMB_COUNT + "");
  private JLabel        lblTimer    = new JLabel("0");
  private boolean        isColorCheatOn  = false;
  private JButton        btnReset    = new JButton("Reset");
 
  private void startThread() {
    Thread th = new Thread(new Runnable() {
      public void run() {
        while (state == GameState.Playing) {
          lblTimer.setText((Long.parseLong(lblTimer.getText()) + 1) + "");
          lblTimer.updateUI();
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    });
    th.start();
  }
 
  private GameState  state  = GameState.NotStarted;
 
  public MineSweeper() {
    setLayout(new BorderLayout());
    add(pnlMain, BorderLayout.CENTER);
    createButtons();
    addControlPanel();
    Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
  }
 
  private void showAbout() {
    JOptionPane.showMessageDialog(this, "<html>Author : Tetyanko Igor ADM2 <br>Version : 1.0</html>", "About", JOptionPane.INFORMATION_MESSAGE);
  }
 
  private void restartGame() {
    state = GameState.NotStarted;
    lblTimer.setText("0");
    pnlMain.removeAll();
    createButtons();
    pnlMain.updateUI();
    lblBombCount.setText("" + MAX_BOMB_COUNT);
    lblBombCount.updateUI();
  }
 
  private void addControlPanel() {
    JPanel pnlTimer = new JPanel(new FlowLayout(FlowLayout.RIGHT));
 
    pnlTimer.add(lblTimer);
 
    JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
 
    btnReset.setToolTipText("<HTML>Press <B>F2</B> to reset the current game</HTML>");
    pnl.add(lblBombCount);
    pnl.add(btnReset);
    JPanel pnlN = new JPanel(new GridLayout(1, 3));
 
    pnlN.add(lblBombCount);
    pnlN.add(pnl);
    pnlN.add(pnlTimer);
    add(pnlN, BorderLayout.NORTH);
    btnReset.addActionListener(this);
  }
 
  private void createButtons() {
    List<Point> lstBombsLocation = new ArrayList<Point>();
 
    for (int row = 0; row < ROWS; row++) {
      for (int col = 0; col < COLUMNS; col++) {
        JButton btn = getButton(lstBombsLocation, TOTAL, new Point(row, col) {
          @Override
          public String toString() {
            return (int) getX() + ", " + (int) getY();
          }
 
          @Override
          public boolean equals(Object obj) {
            return ((Point) obj).getX() == getX() && ((Point) obj).getY() == getY();
          }
        });
        pnlMain.add(btn);
      }
    }
    while (lstBombsLocation.size() < MAX_BOMB_COUNT) {
      updateBomds(lstBombsLocation, pnlMain.getComponents());
    }
    for (Component c : pnlMain.getComponents()) {
      updateBombCount((GameButton) c, pnlMain.getComponents());
    }
     System.out.println("Total Bomb Count: " + lstBombsLocation.size());
    
  }
 
  private void updateBomds(List<Point> lstBombsLocation, Component[] components) {
    //int currentPosition = new Double(((location.x) * COLUMNS ) +
    //location.getY()).intValue();
    Random r = new Random();
    for (Component c : components) {
      Point location = ((GameButton) c).getPosition();
      int currentPosition = new Double(((location.x) * COLUMNS) + location.getY()).intValue();
      int bombLocation = r.nextInt(TOTAL);
      if (bombLocation == currentPosition) {
        ((GameButton) c).setBomb(true);
        lstBombsLocation.add(((GameButton) c).getPosition());
        return;
      }
    }
  }
 
  private GameButton getButton(List<Point> lstBombsLocation, int totalLocations, Point location) {
    GameButton btn = new GameButton(location);
    btn.setMargin(new Insets(0, 0, 0, 0));
    btn.setFocusable(false);
    if (lstBombsLocation.size() < MAX_BOMB_COUNT) {
      if (isBomb()) {
        btn.setBomb(true);
        lstBombsLocation.add(location);
      }
    }
    btn.addMouseListener(new MouseAdapter() {
      @Override
      public void mouseClicked(MouseEvent mouseEvent) {
        if (state != GameState.Playing) {
          state = GameState.Playing;
          startThread();
        }
        if (((GameButton) mouseEvent.getSource()).isEnabled() == false) {
          return;
        }
        if (mouseEvent.getButton() == MouseEvent.BUTTON1) {
          if (((GameButton) mouseEvent.getSource()).getState() == State.Marked) {
            ((GameButton) mouseEvent.getSource()).setState(State.Initial);
            lblBombCount.setText((Long.parseLong(lblBombCount.getText()) + 1) + "");
            ((GameButton) mouseEvent.getSource()).updateUI();
            return;
          }
          ((GameButton) mouseEvent.getSource()).setState(State.Clicked);
          if (((GameButton) mouseEvent.getSource()).isBomb()) {
            blastBombs();
            return;
          } else {
            if (((GameButton) mouseEvent.getSource()).getBombCount() == 0) {
              updateSurroundingZeros(((GameButton) mouseEvent.getSource()).getPosition());
            }
          }
          if (!checkGameState()) {
            ((GameButton) mouseEvent.getSource()).setEnabled(false);
          }
        } else if (mouseEvent.getButton() == MouseEvent.BUTTON3) {
          if (((GameButton) mouseEvent.getSource()).getState() == State.Marked) {
            ((GameButton) mouseEvent.getSource()).setState(State.Initial);
            lblBombCount.setText((Long.parseLong(lblBombCount.getText()) + 1) + "");
          } else {
            ((GameButton) mouseEvent.getSource()).setState(State.Marked);
            lblBombCount.setText((Long.parseLong(lblBombCount.getText()) - 1) + "");
          }
        }
        ((GameButton) mouseEvent.getSource()).updateUI();
      }
    });
    return btn;
  }
 
  private boolean checkGameState() {
    boolean isWin = false;
    for (Component c : pnlMain.getComponents()) {
      GameButton b = (GameButton) c;
      if (b.getState() != State.Clicked) {
        if (b.isBomb()) {
          isWin = true;
        } else {
          return false;
        }
      }
    }
    if (isWin) {
      state = GameState.Finished;
      for (Component c : pnlMain.getComponents()) {
        GameButton b = (GameButton) c;
        if (b.isBomb()) {
          b.setState(State.Marked);
        }
        b.setEnabled(false);
 
      }
      JOptionPane.showMessageDialog(this, "You win the game :D", "Congrats", JOptionPane.INFORMATION_MESSAGE, null);
    }
    return isWin;
  }
 
  private void updateSurroundingZeros(Point currentPoint) {
    Point[] points = getSurroundings(currentPoint);
 
    for (Point p : points) {
      GameButton b = getButtonAt(pnlMain.getComponents(), p);
      if (b != null && b.getBombCount() == 0 && b.getState() != State.Clicked && b.getState() != State.Marked && b.isBomb() == false) {
        b.setState(State.Clicked);
        updateSurroundingZeros(b.getPosition());
        b.updateUI();
      }
      if (b != null && b.getBombCount() > 0 && b.getState() != State.Clicked && b.getState() != State.Marked && b.isBomb() == false) {
        b.setEnabled(false);
        b.setState(State.Clicked);
        b.updateUI();
      }
    }
  }
 
  private void blastBombs() {
    int blastCount = 0;
    for (Component c : pnlMain.getComponents()) {
      ((GameButton) c).setEnabled(false);
      ((GameButton) c).transferFocus();
      if (((GameButton) c).isBomb() && ((GameButton) c).getState() != State.Marked) {
        ((GameButton) c).setState(State.Clicked);
        ((GameButton) c).updateUI();
        blastCount++;
      }
      if (((GameButton) c).isBomb() == false && ((GameButton) c).getState() == State.Marked) {
        ((GameButton) c).setState(State.WrongMarked);
      }
    }
    lblBombCount.setText("" + blastCount);
    lblBombCount.updateUI();
    state = GameState.Finished;
    JOptionPane.showMessageDialog(this, "You loose the game :(", "Game Over", JOptionPane.ERROR_MESSAGE, null);
    for (Component c : pnlMain.getComponents()) {
      GameButton b = (GameButton) c;
      b.setEnabled(false);
    }
  }
 
  private boolean isBomb() {
    Random r = new Random();
    return r.nextInt(ROWS) == 1;
  }
 
  public static void main(String... args) {
    JFrame fr = new JFrame("MineSweeper");
    fr.setLayout(new BorderLayout());
    fr.add(new MineSweeper());
    fr.setResizable(false);
    fr.setSize(250, 350);
    fr.setLocationRelativeTo(null);
    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    fr.setVisible(true);
  }
 
  class GameButton extends JButton {
    private boolean  isBomb    = false;
    private Point  position  = null;
    private int    bombCount  = 0;
    private State  state    = State.Initial;
 
    public void setState(State state) {
      this.state = state;
      if (getBombCount() == 0 && !isBomb) {
        setEnabled(false);
      }
    }
 
    public State getState() {
      return state;
    }
 
    public int getBombCount() {
      return bombCount;
    }
 
    public void setBombCount(int bombCount) {
      this.bombCount = bombCount;
    }
 
    public GameButton(Point position) {
      setPosition(position);
      setText(position.toString());
    }
 
    public Point getPosition() {
      return position;
    }
 
    public void setPosition(Point position) {
      this.position = position;
    }
 
    public boolean isBomb() {
      return isBomb;
    }
 
    public void setBomb(boolean isBomb) {
      this.isBomb = isBomb;
    }
 
    @Override
    public String getText() {
      if (state == State.Initial) {
        return "";
      }
      if (state == State.Marked) {
        return "\u00B6";
      }
      if (state == State.Clicked) {
        if (isBomb) {
          return "<html><font size='16'><b>*</b></font></html>";
        } else {
          if (getBombCount() > 0)
            return getBombCount() + "";
          else
            return "";
        }
      }
      if (state == State.WrongMarked) {
        return "X";
      }
      return super.getText();
    }
 
    @Override
    public Color getBackground() {
      if (isColorCheatOn && isBomb) {
        return Color.MAGENTA;
      }
      if (state == State.Clicked) {
        if (isBomb) {
          return Color.RED;
        }
        if (getBombCount() > 0) {
          return Color.GREEN;
        }
      }
      if (isEnabled()) {
        return Color.YELLOW.brighter();
      } else {
        return super.getBackground();
      }
    }
  }
 
  private Point[] getSurroundings(Point cPoint) {
    int cX = (int) cPoint.getX();
    int cY = (int) cPoint.getY();
    Point[] points = { new Point(cX - 1, cY - 1), new Point(cX - 1, cY), new Point(cX - 1, cY + 1), new Point(cX, cY - 1), new Point(cX, cY + 1), new Point(cX + 1, cY - 1), new Point(cX + 1, cY), new Point(cX + 1, cY + 1) };
    return points;
  }
 
  private void updateBombCount(GameButton btn, Component[] components) {
    Point[] points = getSurroundings(btn.getPosition());
 
    for (Point p : points) {
      GameButton b = getButtonAt(components, p);
      if (b != null && b.isBomb()) {
        btn.setBombCount(btn.getBombCount() + 1);
      }
    }
    btn.setText(btn.getBombCount() + "");
  }
 
  private GameButton getButtonAt(Component[] components, Point position) {
    for (Component btn : components) {
      if ((((GameButton) btn).getPosition().equals(position))) {
        return (GameButton) btn;
      }
    }
    return null;
  }
 
  public void eventDispatched(AWTEvent event) {
    if (KeyEvent.class.isInstance(event) && ((KeyEvent) (event)).getID() == KeyEvent.KEY_RELEASED) {
      if (((KeyEvent) (event)).getKeyCode() == KeyEvent.VK_F1) {
        showAbout();
      }
      if (((KeyEvent) (event)).getKeyCode() == KeyEvent.VK_F2) {
        restartGame();
      }
      if (((KeyEvent) (event)).getKeyCode() == KeyEvent.VK_F3) {
        isColorCheatOn = !isColorCheatOn;
        if (state == GameState.Playing) {
          pnlMain.updateUI();
        }
      }
 
      if (((KeyEvent) (event)).getKeyCode() == KeyEvent.VK_F12) {
        for (Component c : pnlMain.getComponents()) {
          GameButton b = (GameButton) c;
          if (b.isBomb() == false) {
            b.setState(State.Clicked);
          } else {
            b.setState(State.Marked);
          }
          b.setEnabled(false);
        }
        checkGameState();
      }
    }
  }
 
  public void actionPerformed(ActionEvent actionEvent) {
    if (actionEvent.getSource() == btnReset) {
      restartGame();
    }
  }
}
Добавлено через 2 минуты
Во 2-й я не понял, что нужно и главное как сохранить в файл (см. 1-й пост). Например в игре есть таймер, может в файл записывать через сколько прошел игру, или через какое время проиграл. Там все в сек. В общем

Добавлено через 20 часов 12 минут


Добавлено через 1 час 2 минуты
Йоу, Йоу, Йоу разобрался с первой прогой.

Добавлено через 1 минуту
0
 Аватар для SAZl
2 / 9 / 0
Регистрация: 12.10.2011
Сообщений: 173
16.12.2013, 20:30  [ТС]
Тема закрыта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2013, 20:30
Помогаю со студенческими работами здесь

Java GUI desinger - Есть ли здесь визуальный редактор графического интерфейса?
Я недавно начал писать на java. До этого писал на С++. Есть ли здесь Визуальный редактор графического интерфейса? Если есть можете скинуть...

Разработка графического приложения
Доброе Утро!!! Помогите Пожалуйста! Разрабатываю графическое приложение на языке Java в Net Beans. Создал новый проект как графическое...

Добавление Skin для графического интерфейса (eclipse)
Всем привет! Скажите как добавить скин для графического интерфейса в библиотеки проекта (в eclipse)?

Разработка интерфейса пользователя для отображения в окне браузера
Доброе времени суток уважаемые форумчани. Подскажите пожалуйста куда копать. Я хочу написать интерфейс пользователя на java. Но данный...

Разработка кроссплатформенного графического интерфейса?
Вопрос не много не в тот форум, но более подходящего не нашел. Как разрабатывается гуи на примере вот этого редактора...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru