Источник статьи: Компьютерный энтузиаст Автор: Чжан Цзянь
Вы еще помните Миникупера, который, как эльф, носился по голливудским улицам в «Последнем дне»? Марк Уолберг и Салли Терон ездили на нем, чтобы перевезти золото стоимостью в десятки миллионов прямо под носом у своих врагов. Однако, если бы перед вами сейчас оказался кузов Minicooper, который не может быстро бегать, как бы вы об этом подумали? Это все еще странствующий эльф? Сегодня давайте соберем детали этого Minicooper по частям и дадим ему поработать.
Предисловие
Начиная с этого выпуска, мы предоставляем вам полный исходный код игры (нажмите, чтобы скачать). Java Cafe выступает за то, чтобы все уделяли одинаковое внимание теории и практике. В этой серии мы познакомим вас с ключевыми технологиями и идеями реализации. Друзья могут читать исходный код вместе со статьей, так же, как одновременно читать газету и пить кофе. время. На этом аромат Didi не исчерпывается.
макет игры
«Lianliankan» — это двухмерная шахматная игра. Если вы хотите создать шахматную игру, GridLayout будет лучшим выбором. Теперь давайте взглянем на конструктор GridLayout:
・GridLayout(): по умолчанию область макета разделена на части размером 1*1.
・GridLayout(int rows, int cols): определяет количество горизонтальных и вертикальных сеток в области макета.
・GridLayout(int rows, int cols, int hgap, int vgap): То же, что и выше, но также определяет горизонтальный интервал hgap и вертикальный интервал vgap между каждой сеткой.
Не позволяйте этим трем конструкторам вас напугать. На самом деле, если они вам нравятся, вы можете уверенно использовать любой из них. Даже если вы случайно воспользуетесь «неправильным» конструктором, есть способы настроить его в будущем. Единственное, что следует отметить, это то, что при добавлении элементов управления в GridLayout порядок по умолчанию — от верхнего левого угла к правому нижнему.
Теперь определимся с количеством сеток для игры. Сколько сеток подходит? Слишком малое количество сделает игру менее сложной, слишком большое вызовет визуальный эффект. Поэтому нам следует выразить это через пару констант. Даже если мы захотим изменить его в будущем, это будет несложно.
В Java определение констант необходимо записать в виде общедоступной финальной статики. Если мы оговорим, что игровое поле имеет 8 сеток по горизонтали и 8 сеток по вертикали, то мы должны определить это следующим образом:
публичный окончательный статический int ROW = 8;
публичный окончательный статический int COLUMN = 8;
Затем мы используем второй конструктор GridLayout для создания макета:
GridLayout GridLayout = новый GridLayout (СТРОКА, СТОЛБЕЦ);
Наконец, нам также необходимо изменить макет игровой области (contentPanel) на приведенный выше макет:
contentPanel.setLayout(gridLayout);
Если вы сейчас скомпилируете и запустите программу, у вас может возникнуть вопрос: Почему в интерфейсе не произошло никаких изменений? Что-то не так? Хотя мы указали макет, элементы управления не были добавлены, поэтому, конечно, никаких изменений не видно. Теперь добавим кнопки в макет:
for (int i = 0; i <ROW * COLUMN; i++) {
Кнопка JButton = новая JButton("Kyodai");
contentPanel.add (кнопка);
}
Попробуйте запустить программу еще раз. Она такая же, как у меня (см. рис. 1)?
Умное использование JButton для поднятия шума
JButton — это элемент управления «кнопка». Это также чрезвычайно распространенный элемент управления в Swing. Однако нам все равно придется потратить немного усилий, чтобы понять и использовать его, потому что, когда вы сможете умело использовать JButton, вы найдете другие элементы управления Swing. тоже так похожи.
Если вы запустите только что написанную программу, вы обнаружите, что кнопки в игровой области всегда заполнены, что очень неудобно для реальной работы игры. Поэтому нам нужно найти способ освободить некоторые сетки. Макет GridLayout хорош, но при добавлении элементов управления нельзя пропустить определенную сетку. Что мне теперь делать?
На самом деле это несложно. Поскольку GridLayout не позволяет пропускать, если мы интегрируем элементы управления, добавленные в определенную сетку, с фоном макета GridLayout, мы добьемся последовательного визуального эффекта. Кроме того, если кто-то случайно нажмет на эту сетку, кнопка все равно будет видна. Нам нужно найти способ предотвратить нажатие кнопки, что требует использования метода setEnabled() класса JButton. Наконец, для интерактивных кнопок при нажатии мы должны определить, какая кнопка была нажата.
Когда мы в последний раз реализовали функцию «О программе», мы использовали метод e.getSource() для определения источника события щелчка мыши. Однако это было эффективно только для именованных элементов управления. Здесь использование массива для представления кнопок, несомненно, является лучшим способом. Во-первых, давайте изменим приведенный выше код:
JButton[] точки = новая JButton[СТРОКА * СТОЛБЕЦ];
for (int i = 0; i <ROW * COLUMN; i++) {
точки [i] = новая JButton («Кёдай»);
точки[i].setActionCommand("" + i);
contentPanel.add(точки [i]);
точки [i].addActionListener (это);
}
Не забудьте написать dots[i] = new JButton("Kyodai") в теле цикла. Хотя номер группы точек был определен и использован ранее, это только сообщает программе, что нам нужно использовать некоторые JButtons, но эти. JButtons все еще не инициализированы. При этом мы не только используем setActionCommand() для указания имен событий для кнопок, но также используем метод addActionListener() для добавления обработки ответа на событие для каждой кнопки.
Что касается кода ответа на событие, мы можем добавить его после исходного кода события actionPerformed():
if (e.getSource() экземпляр JButton) {
Кнопка JButton = (JButton) e.getSource();
int offset = Integer.parseInt(button.getActionCommand());
внутренняя строка, столбец;
строка = Math.round(смещение/СТОЛБЕЦ);
col = смещение - строка * COLUMN;
JOptionPane.showMessageDialog(this, "ROW="+row+", COL="
+ col, «Кнопка», JOptionPane.INFORMATION_MESSAGE);
}
В приведенном выше коде e.getSource() экземпляр JButton используется для определения того, создано ли сгенерированное событие элементом управления типа JButton, а затем выполняет принудительное преобразование класса для элемента управления, который генерирует источник события, а затем использует Integer.parseInt( button Метод .getActionCommand()) преобразует полученное имя события в целое число, а следующий код восстанавливает это целое число в информацию о строках и столбцах.
Хорошо, теперь запустите программу и нажмите каждую кнопку, чтобы увидеть, появится ли диалоговое окно, подобное показанному справа?
Обратите внимание, что наши индексы начинаются с 0. Исходный код программы этого выпуска (нажмите, чтобы скачать).
Использование изображений в Swing
В настоящее время мы решили проблему работы пользователя. Для того, чтобы интерфейс был красивым, нам нужно вместо текста использовать картинки. Друзья, у которых есть время и терпение, могут сделать персонализированные изображения самостоятельно, но будьте осторожны, чтобы размер каждого изображения был одинаковым, иначе оно будет слишком некрасивым. Если вы хотите избежать проблем, вы также можете напрямую использовать изображения, представленные в пакете загрузки.
В Swing вы можете использовать метод setIcon(Image image) для установки изображения для JButton. Параметр image — это объект изображения, который мы хотим установить. Есть много способов получить этот объект:
・Используйте класс Toolkit, чтобы получить:
изображение = Toolkit.getDefaultToolkit().getImage(url);
・Используйте метод getImage() класса ImageIcon, чтобы получить:
изображение = новый ImageIcon(getClass().getResource(имя файла)).getImage();
Здесь мы выбираем первый метод. Чтобы облегчить повторное получение объекта Image в будущем, мы можем записать это как функцию:
Изображение getImage(String filename){
URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
URL-адрес = ноль;
Изображение изображения = ноль;
URL = urlLoader.findResource(имя файла);
изображение = Toolkit.getDefaultToolkit().getImage(url);
вернуть изображение;
}
С этой функцией в дальнейшем будет гораздо удобнее пользоваться изображениями, не правда ли?
Теперь, когда изображение доступно, мы можем выразить информацию карты в Map.Java в пакете исходного кода в виде изображения. Поскольку этот код касается кода алгоритма игры, я больше не буду приводить код, давайте вкратце объясним, как это делается здесь! В Map.Java мы используем двумерный массив map[][] для сохранения информации об изображении. В то же время мы также используем одномерный массив images[] для сохранения каждого объекта изображения. значение. Это значение не только указывает значение, соответствующее кнопке в интерфейсе игры, но также указывает номер изображения в массиве images[], используемом этой кнопкой. Интерфейс запуска программы будет намного красивее.
краткое содержание
Сегодня мы представили элемент управления JButton в Swing. Для большинства элементов управления Swing можно скопировать использование JButton. Не стоит недооценивать эту кнопку J. Когда вы хорошо освоите ее, ваши навыки Swing поднимутся на более высокий уровень. Кроме того, мы также изучили два метода загрузки файлов изображений в Java. Наконец, мы объединили две вышеуказанные части, чтобы создать красивый игровой интерфейс. Хоть я и не написал здесь полный код, я считаю, что каждый сможет достичь цели, обратившись к моей исходной программе и собственными усилиями. Если вы столкнулись с проблемой, которую невозможно решить, вы можете связаться со мной по адресу [email protected].
Не знаю, доволен ли ты сегодняшним контентом? Азарт еще впереди, всем стоит и дальше заходить в наше кафе!