DefaultButton refactor: adding visual improvements, existing Classes and Methods, introducing AppTheme interface

This commit is contained in:
Josh Ashton
2022-11-15 21:03:42 -07:00
parent f07b131125
commit d8c2617680
24 changed files with 281 additions and 177 deletions
@@ -1,5 +1,6 @@
package FileManagement;
import java.awt.*;
import java.io.*;
import java.util.Arrays;
@@ -15,6 +16,21 @@ public class FileManager {
findSavedCharacters();
loadFonts();
}
private void loadFonts() {
try {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("dndBuilder/src/Resources/Fonts/SanSalvi.ttf")));
} catch (IOException|FontFormatException e) {
//Handle exception
System.out.println("Error finding font.");
}
}
public boolean isReturninguser() {
+28
View File
@@ -0,0 +1,28 @@
package GUI;
import java.awt.*;
public interface AppTheme {
public Color lightAccent = Color.decode("#EAF0CE");
public Color lightBrown = Color.decode("#EBBE9B");
public Color medBrown = Color.decode("#E4A677");
public Color darkBrown = Color.decode("#502419");
public Color darkestBrown = Color.decode("#1F0E0A");
public Color black = Color.BLACK;
public Color confirmationBlue = Color.decode("#296EB4");
public Color rejectionRed = Color.decode("#A23E48");
public Font headerFont = new Font("SanSalvi", Font.BOLD, 45);
public Font subHeaderFont = new Font("SanSalvi", Font.PLAIN, 35);
public Font paragraphFont = new Font("SanSalvi", Font.PLAIN, 20);
public Font buttonFont = new Font("SanSalvi", Font.PLAIN, 15);
}
+43 -86
View File
@@ -1,30 +1,12 @@
package GUI;
import Character.AbilityScores.Stats;
import Character.Classes.*;
import Character.Races.*;
import GUI.Panels.*;
import Resources.CustomAssets.DefaultButton;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/* private void getNextPanel() {
return switch (currentPanel) {
case 1 -> guiPanels.getRacePanel();
case 2 -> guiPanels.getClassPanel();
case 3 -> guiPanels.getAbilityScorePanel();
case 4 -> guiPanels.getDescriptionPanel();
case 5 -> guiPanels.getEquipmentPanel();
case 6 -> guiPanels.getFinalizePanel();
case 7 -> guiPanels.getLoadMenuPanel();
default -> guiPanels.getMainMenuPanel();
};
}*/
public class GUImanager extends JFrame {
private static JPanel[] panels;
@@ -56,7 +38,7 @@ public class GUImanager extends JFrame {
}*/
add(createMasterPanel());
add(panels[currentPanel]);
}
@@ -64,8 +46,10 @@ public class GUImanager extends JFrame {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout());
setPreferredSize(new Dimension(730,550));
setPreferredSize(new Dimension(750,550));
setSize(getPreferredSize());
setResizable(false);
setLocationRelativeTo(null);
try {
UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
@@ -75,38 +59,38 @@ public class GUImanager extends JFrame {
}
private JPanel createMasterPanel() {
private DefaultButton createBackButton() {
JPanel masterPanel = new JPanel();
masterPanel.add(panels[currentPanel]);
DefaultButton button = new DefaultButton("Back");
button.addActionListener(
JPanel navigationContainer = new JPanel(new GridLayout(1, 2, 10, 10));
navigationContainer.add(createBackButton());
navigationContainer.add(createContinueButton());
e -> {
//masterPanel.add(navigationContainer);
lastPanel--;
currentPanel--;
nextPanel--;
clearAndReset();
// return masterPanel;
}
return panels[currentPanel];
);
return button;
}
private JButton createBackButton() {
private DefaultButton createContinueButton() {
JButton button = new JButton("Back");
DefaultButton button = new DefaultButton("Continue");
button.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
e -> {
lastPanel--;
currentPanel--;
nextPanel--;
clearAndReset();
lastPanel++;
currentPanel++;
nextPanel++;
clearAndReset();
}
}
);
@@ -115,46 +99,20 @@ public class GUImanager extends JFrame {
}
private JButton createContinueButton() {
private DefaultButton createRandomCharacterButton() {
JButton button = new JButton("Continue");
button.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
lastPanel++;
currentPanel++;
nextPanel++;
clearAndReset();
}
}
);
return button;
}
private JButton createRandomCharacterButton() {
JButton button = new JButton("Create Random Character");
DefaultButton button = new DefaultButton("Create Random Character");
button.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
e -> {
createRandomCharacter();
createRandomCharacter();
lastPanel = currentPanel;
currentPanel = 6;
nextPanel = currentPanel + 1;
clearAndReset();
lastPanel = currentPanel;
currentPanel = 6;
nextPanel = currentPanel + 1;
clearAndReset();
}
}
);
@@ -163,22 +121,19 @@ public class GUImanager extends JFrame {
}
private JButton createSaveButton() {
private DefaultButton createSaveButton() {
JButton button = new JButton("Save");
DefaultButton button = new DefaultButton("Save");
button.addActionListener(
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
e -> {
lastPanel = currentPanel;
currentPanel = 6;
nextPanel = currentPanel + 1;
clearAndReset();
lastPanel = currentPanel;
currentPanel = 6;
nextPanel = currentPanel + 1;
clearAndReset();
}
}
}
);
@@ -186,6 +141,7 @@ public class GUImanager extends JFrame {
}
// TODO: Need to implement.
private void createRandomCharacter() {
@@ -196,10 +152,11 @@ public class GUImanager extends JFrame {
getContentPane().removeAll();
add(createMasterPanel());
add(panels[currentPanel]);
repaint();
revalidate();
pack();
}
-13
View File
@@ -1,13 +0,0 @@
package GUI;
import java.awt.*;
public interface PanelTheme {
public Color deepRed = new Color(165, 42, 42);
public Color lightBrown = new Color(222, 184, 135);
public Color darkBrown = new Color(205, 133, 63);
public Color black = new Color(0, 0, 0);
}
+53 -46
View File
@@ -1,38 +1,38 @@
package GUI.Panels;
import GUI.PanelTheme;
import GUI.AppTheme;
import GUI.Panels.SubPanels.*;
import Resources.CustomAssets.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;
import javax.swing.border.*;
public class ChooseRacePanel extends JPanel implements PanelTheme {
public class ChooseRacePanel extends JPanel implements AppTheme {
private String[] raceOptions;
private String[] raceDescriptions;
private InfoPanel infoPanel;
private int raceIndex;
private JButton backButton;
private JButton continueButton;
/**
* Create the panel.
*/
public ChooseRacePanel(JButton backButton, JButton continueButton) {
private DefaultButton[] raceOptionButtons;
public ChooseRacePanel(JButton backButton, DefaultButton continueButton) {
super();
this.backButton = backButton;
this.continueButton = continueButton;
raceIndex = 0;
createRaces();
this.infoPanel = new InfoPanel(raceOptions, raceDescriptions);
panelSetup();
add(createMasterPanel());
createMasterPanel();
}
@@ -48,41 +48,49 @@ public class ChooseRacePanel extends JPanel implements PanelTheme {
}
private JPanel createMasterPanel() {
private void createMasterPanel() {
JLabel lblNewLabel = new JLabel("Step 1: Choose Race");
lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);
lblNewLabel.setFont(new Font("Bodoni 72 Oldstyle", Font.PLAIN, 33));
add(lblNewLabel, BorderLayout.NORTH);
JPanel racePanel = new JPanel();
racePanel.setOpaque(false);
racePanel.setLayout(null);
racePanel.add(infoPanel);
JLabel title = new JLabel("Step 1: Choose Race");
title.setHorizontalAlignment(SwingConstants.CENTER);
title.setFont(headerFont);
title.setForeground(darkestBrown);
add(title, BorderLayout.NORTH);
JPanel racePanel = new JPanel();
racePanel.setOpaque(false);
racePanel.setLayout(null);
racePanel.add(infoPanel);
racePanel.add(createRaceButtonPanel());
add(createNavPanel(), BorderLayout.SOUTH);
return racePanel;
add(racePanel);
add(createNavPanel(), BorderLayout.SOUTH);
}
private JPanel createRaceButtonPanel() {
JPanel raceBtnPanel = new JPanel(new GridLayout(raceOptions.length, 1, 15, 5));
raceBtnPanel.setBackground(darkBrown);
raceBtnPanel.setBounds(311, 6, 109, 394);
JPanel buttonPanel = new JPanel(new GridLayout(raceOptions.length, 1, 0, 0));
buttonPanel.setBackground(lightBrown);
buttonPanel.setBounds(585, 45, 135, 355);
raceOptionButtons = new DefaultButton[raceOptions.length];
for (int i = 0; i < raceOptionButtons.length; i++) {
raceOptionButtons[i] = createButton(raceOptions[i], i);
}
for (int i = 0; i < raceOptions.length; i++) {
raceBtnPanel.add(createButton(raceOptions[i], i));
buttonPanel.add(raceOptionButtons[i]);
}
return raceBtnPanel;
return buttonPanel;
}
@@ -95,9 +103,9 @@ public class ChooseRacePanel extends JPanel implements PanelTheme {
private JPanel createNavPanel() {
JPanel panel = new JPanel();
panel.setBackground(darkBrown);
JPanel panel = new JPanel(new GridLayout(1, 2, 30, 0));
panel.setBackground(darkestBrown);
panel.setBorder(new EmptyBorder(15, 150, 15, 150));
panel.add(backButton);
panel.add(continueButton);
@@ -105,30 +113,29 @@ public class ChooseRacePanel extends JPanel implements PanelTheme {
}
private JButton createButton(String raceName, int index) {
private DefaultButton createButton(String raceName, int index) {
JButton button = new JButton(raceName);
button.addActionListener(
e -> {
raceIndex = index;
infoPanel.updateInfo(raceIndex);
}
);
DefaultButton button = new DefaultButton(raceName);
button.addActionListener(e -> updateButtons(raceIndex, index));
return button;
}
private void updateButtons(int lastIndex, int newIndex) {
raceOptionButtons[lastIndex].deSelect();
raceOptionButtons[newIndex].select();
raceIndex = newIndex;
infoPanel.updateInfo(raceIndex);
}
public int getRaceChoice() {
return raceIndex;
}
}
@@ -1,17 +1,17 @@
package GUI.Panels.SubPanels;
import GUI.PanelTheme;
import GUI.AppTheme;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Objects;
import java.util.Random;
public class InfoPanel extends JPanel implements PanelTheme {
public class InfoPanel extends JPanel implements AppTheme {
private JTextArea[] descriptions;
private String[] holderDescriptions;
@@ -48,7 +48,7 @@ public class InfoPanel extends JPanel implements PanelTheme {
panelSetup();
add(descriptions[holderIndex]);
add(descriptions[0]);
add(portraits[holderIndex][getNextPortrait(holderIndex)]);
repaint();
@@ -77,14 +77,16 @@ public class InfoPanel extends JPanel implements PanelTheme {
private void panelSetup() {
setOpaque(false);
setBounds(6, 6, 293, 394);
setBounds(5, 5, 600, 400);
setLayout(null);
JLabel infoLbl = new JLabel("Information");
infoLbl.setFont(new Font("Bodoni 72", Font.PLAIN, 20));
infoLbl.setHorizontalAlignment(SwingConstants.CENTER);
infoLbl.setBounds(92, 6, 105, 16);
add(infoLbl);
JLabel subHeader = new JLabel("Description");
subHeader.setFont(subHeaderFont);
subHeader.setHorizontalAlignment(SwingConstants.LEFT);
subHeader.setBounds(275, 10, 300, 35);
subHeader.setForeground(darkestBrown);
add(subHeader);
}
@@ -101,8 +103,10 @@ public class InfoPanel extends JPanel implements PanelTheme {
tmpDesc.setOpaque(false);
tmpDesc.setEditable(false);
tmpDesc.setFocusable(false);
tmpDesc.setFont(new Font("Bodoni 72", Font.PLAIN, 10));
tmpDesc.setBounds(6, 21, 281, 196);
tmpDesc.setFont(paragraphFont);
tmpDesc.setBounds(275, 45, 300, 355);
tmpDesc.setBorder(new EmptyBorder(5, 5, 5, 5));
tmpDesc.setForeground(darkestBrown);
descriptions[i] = tmpDesc;
@@ -118,32 +122,17 @@ public class InfoPanel extends JPanel implements PanelTheme {
File imagesDir;
/*
WINDOWS:
attempted
dndBuilder/src/GUI/img/category/
dndBuilder/src/GUI/img/category
/dndBuilder/src/GUI/img/category
/dndBuilder/src/GUI/img/category/
GUI/img/category/
/GUI/img/category/
src/GUI/img/category/
/src/GUI/img/category/
*/
if(OS.startsWith("Windows")) {
imagesDir = new File("dndBuilder\\src\\GUI\\img\\" + categoryHolder[i] + "\\");
imagesDir = new File("dndBuilder\\src\\Resources\\Img\\" + categoryHolder[i] + "\\");
} else if (OS.startsWith("Mac")) {
imagesDir = new File("dndBuilder/src/GUI/img/" + categoryHolder[i] + "/");
imagesDir = new File("dndBuilder/src/Resources/Img/" + categoryHolder[i] + "/");
} else if (OS.startsWith("Linux")) {
imagesDir = new File("dndBuilder/src/GUI/img/" + categoryHolder[i] + "/");
imagesDir = new File("dndBuilder/src/Resources/Img/" + categoryHolder[i] + "/");
} else {
@@ -161,7 +150,7 @@ public class InfoPanel extends JPanel implements PanelTheme {
portraits[i][index] = image(file);
portraits[i][index].setOpaque(true);
portraits[i][index].setBackground(lightBrown);
portraits[i][index].setBounds(6, 229, 281, 159);
portraits[i][index].setBounds(10, 45, 250, 355);
index++;
@@ -180,7 +169,7 @@ public class InfoPanel extends JPanel implements PanelTheme {
try {
img = ImageIO.read(file);
finalImg = img.getScaledInstance(281, 196, Image.SCALE_SMOOTH);
finalImg = img.getScaledInstance(250, 375, Image.SCALE_SMOOTH);
} catch (Exception e) {
@@ -0,0 +1,87 @@
package Resources.CustomAssets;
import GUI.AppTheme;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class DefaultButton extends JButton implements AppTheme {
private boolean selected;
public DefaultButton(String buttonLabel) {
super(buttonLabel);
applyDefaultButtonStyle();
applyCommon();
}
public void deSelect() {
selected = false;
applyDefaultButtonStyle();
}
public void select() {
selected = true;
applyFocusedButtonStyle();
}
private void applyDefaultButtonStyle() {
setBackground(medBrown);
setForeground(darkestBrown);
}
private void applyFocusedButtonStyle() {
setBackground(darkestBrown);
setForeground(lightAccent);
}
private void applyCommon() {
addMouseListener(
new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) { applyFocusedButtonStyle(); }
@Override
public void mouseExited(MouseEvent e) {
if (!selected) {
applyDefaultButtonStyle();
}
}
}
);
setFocusPainted(false);
setFont(buttonFont);
setBorder(new EmptyBorder(3, 3, 3, 3));
repaint();
revalidate();
}
}
@@ -0,0 +1,33 @@
package Resources.CustomAssets;
import javax.swing.border.*;
import java.awt.*;
public class RoundedBorder implements Border {
private int radius;
public RoundedBorder(int radius) {
this.radius = radius;
}
public Insets getBorderInsets(Component c) {
return new Insets(this.radius+1, this.radius+1, this.radius+2, this.radius);
}
public boolean isBorderOpaque() {
return true;
}
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
g.drawRoundRect(x, y, width-1, height-1, radius, radius);
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Before

Width:  |  Height:  |  Size: 111 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB