Проект находится по адресу: https://github.com/Norfin85/TankBattle
Вся графика реализована в файле: Graphics.java.
Открытие окна происходит через стандартную для Swing процедуру:
С помощью SwingUtilities.invokeLater мы помещаем создание окна в очередь событий - event dispatch thread.
Основное окно использует компоновщик BoxLayout:
frame.setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)
и размещает панели сверху-вниз.
Внутрь окна мы помещаем две панели: MainPanel и BottomPanel, которые будут содержать более детальные блоки программы, о чем будет рассказано ниже.
Примерная структура любого окна в Swing:
Параметры нашего окна определяются следующими командами:
На первый взгляд мудрено....
Рассмотрим более детально.
Внутрь MainPanel помещаются три панели - LeftPanel, CenterPanel, RightPanel, для них задаются конкретные размеры с помощью функции setPreferredSize(new Dimension(X, Y)). Дальше простая арифметика - сумма параметров по X и Y должна равняться параметрам
X и Y MainPanel.
Внутри MainPanel используется тоже компоновщик BoxLayout, но уже по оси X, размещающий панели слева-направо.
Внутрь панелей вносятся элементы. Для позиционирования элементов я выбрал способ - создание EmptyBorder(int top, int left, int bottom, int right) и задание конкретных размеров элементов через функцию setPreferredSize(new Dimension(X, Y)).
В BottomPanel помещаются две кнопки и разносятся по сторонам через:
setAlignmentX(Component.RIGHT_ALIGNMENT)
setAlignmentX(Component.LEFT_ALIGNMENT)
Внутри элементов TextPanel размещаются элементы JTextPane. Использование данных элементов позволило стилизовать текст через следующую конструкцию:
StyleConstants.setAlignment(simpleAttributeSet, StyleConstants.ALIGN_LEFT)- выравнивание по левому краю.
StyleConstants.setFontSize(simpleAttributeSet, 12) - размер шрифта.
StyleConstants.setFontFamily(simpleAttributeSet, "Times New Roman, cursive") - семейство шрифта.
simpleAttributeSet.addAttribute(StyleConstants.CharacterConstants.Foreground, new Color(112, 126, 173)) - цвет шрифта.
Дляотражения имеющихся танков использованы JProgressBar-ы, в дальнейшем они будут отражать промежуточные показатели здоровья танком, а не только жив-мертв.
setMinimum(0) - минимальное значение в прогресс баре.
setMaximum(100) - максимальное значение.
setValue(100) - текущее значение.
setString("Легкий танк СССР " + (i + 1)) - аннотация.
BattleList (JTextPane) мы помещаем внутрь JScrollBar и назначаем параметр jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS) - чтобы всегда отражался скролл.
Все блоки графики имеют статус private, т.е. изменения возможны только через специальный интерфейс - обычные правила хорошего тона в программировании (если судить по книжкам).
public static void setButton(String text, Boolean setActive) - меняет нашу кнопку buttom (меняет текст и делает активно/неактивной).
public static void setHealthes(Tank ussrTank, Tank germanTank) - меняет параметры здоровья в текстовых блоках слева и справа.
public static void setCurrentBattle(Tank ussrTank, Tank germanTank) - устанавливает текст текущей битвы в текстовом блоке CurrentBattle.
public static void updateFrame() - обновляем окно.
public static void updateBattleList() - обновляем battleList.
public static void startBattle() - запускает бой.
public static void setTankHealth(int id, int percent) - устанавливает значение здоровья танка в соответствующем JProgressBar.
public static void showLog() - отображает окно лога битвы.
Лог битвы выведен на отдельную кнопку, открывающую окно лога, состоящего из JFrame и помещенного в него JScrollBar с вложенным в него JTextPane.
За сим на сегодня все..) Продолжение следует...)