MainWindow.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package ui;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.FlowLayout;
  5. import java.awt.Font;
  6. import java.awt.GridLayout;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9. import java.util.ArrayList;
  10. import javax.swing.ImageIcon;
  11. import javax.swing.JButton;
  12. import javax.swing.JComponent;
  13. import javax.swing.JFrame;
  14. import javax.swing.JLabel;
  15. import javax.swing.JPanel;
  16. import javax.swing.UIManager;
  17. import javax.swing.border.Border;
  18. import javax.swing.border.CompoundBorder;
  19. import javax.swing.border.EmptyBorder;
  20. import javax.swing.border.LineBorder;
  21. import cards.Karte;
  22. import cards.KartenDeck;
  23. public class MainWindow {
  24. private JFrame frame;
  25. private JPanel bottomPanel, topPanel, cardPanel;
  26. private JButton previousPageButton, nextPageButton;
  27. private JLabel numberOfPagesLabel, numberOfCardsLabel;
  28. private int numberOfPages = 0, numberOfCards = 0, activePageNumber = 1;
  29. private KartenDeck kartenDeck;
  30. public MainWindow() {
  31. initialize();
  32. }
  33. private void initialize() {
  34. applyUIManagerTheme();
  35. createMasterFrame();
  36. createBottomPanel();
  37. createTopPanel();
  38. createCardPanel();
  39. createCardDeck();
  40. redrawCardPanel();
  41. updateBottomPanelNumbers();
  42. displayAndPackFrame();
  43. }
  44. private void createCardDeck() {
  45. kartenDeck = new KartenDeck();
  46. kartenDeck.generateFullDeck();
  47. }
  48. private void applyUIManagerTheme() {
  49. UIManager.put("ToolTip.background", Color.decode("#A3BE8C"));
  50. UIManager.put("ToolTip.border", new LineBorder(Color.decode("#2E3440"),
  51. 1));
  52. }
  53. private void createCardPanel() {
  54. cardPanel = new JPanel(new GridLayout(3, 8, 10, 10));
  55. Border border = cardPanel.getBorder();
  56. Border margin = new EmptyBorder(0, 10, 0, 10);
  57. cardPanel.setBorder(new CompoundBorder(border, margin));
  58. }
  59. private void displayAndPackFrame() {
  60. frame.add(topPanel, BorderLayout.NORTH);
  61. frame.add(cardPanel, BorderLayout.CENTER);
  62. frame.add(bottomPanel, BorderLayout.SOUTH);
  63. frame.pack();
  64. }
  65. private void redrawCardPanel() {
  66. int startIndex = (24 * (activePageNumber - 1));
  67. int endIndex = (Math.min((24 * (activePageNumber - 1) + 23),
  68. (kartenDeck.getDeckSize() - 1)));
  69. ArrayList<Karte> kartenListe = kartenDeck.getDeck();
  70. cardPanel.removeAll();
  71. for (int index = startIndex; index <= endIndex; index++) {
  72. Karte karte = kartenListe.get(index);
  73. String iconImagePath = "img/cards/" +
  74. karte.getFarbe().toString().toLowerCase() +
  75. "-" + karte.getWert() + ".png";
  76. JLabel jlabel = new JLabel();
  77. ImageIcon labelIcon = new ImageIcon(iconImagePath);
  78. jlabel.setIcon(labelIcon);
  79. cardPanel.add(jlabel);
  80. }
  81. cardPanel.revalidate();
  82. cardPanel.repaint();
  83. }
  84. private void applyNordTextTheme(JComponent jComponent) {
  85. jComponent.setBackground(Color.decode("#373D49"));
  86. jComponent.setForeground(Color.decode("#D8DEE9"));
  87. jComponent.setFont(new Font("sans-serif", Font.PLAIN, 24));
  88. }
  89. private void createTopPanel() {
  90. topPanel = new JPanel();
  91. topPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 50, 10));
  92. topPanel.setBackground(Color.decode("#2E3440"));
  93. JLabel mischMaschineLabel = createMischMaschineLabel();
  94. JButton mischButton = createMischButton();
  95. mischButton.addActionListener(new ActionListener(){
  96. @Override
  97. public void actionPerformed(ActionEvent e) {
  98. mischButton.setEnabled(false);
  99. kartenDeck.mischen();
  100. goToPageDirection(0);
  101. mischButton.setEnabled(true);
  102. }
  103. });
  104. topPanel.add(mischMaschineLabel);
  105. topPanel.add(mischButton);
  106. }
  107. private JLabel createMischMaschineLabel() {
  108. JLabel mischmaschineLabel = new JLabel("Mischmaschine");
  109. applyNordTextTheme(mischmaschineLabel);
  110. ImageIcon mischmaschineIcon = new ImageIcon("img/shuffle-64.png");
  111. mischmaschineLabel.setIconTextGap(10);
  112. mischmaschineLabel.setIcon(mischmaschineIcon);
  113. return mischmaschineLabel;
  114. }
  115. private JButton createMischButton() {
  116. JButton mischButton = new JButton("Mischen");
  117. applyNordTextTheme(mischButton);
  118. mischButton.setFocusable(false);
  119. mischButton.setToolTipText("Mische alle Karten in der Maschine");
  120. return mischButton;
  121. }
  122. private void goToPreviousPage() {
  123. if (activePageNumber == 1)
  124. return;
  125. goToPageDirection(-1);
  126. }
  127. private void goToNextPage() {
  128. if (activePageNumber == numberOfPages)
  129. return;
  130. goToPageDirection(1);
  131. }
  132. private void goToPageDirection(int direction) {
  133. activePageNumber += direction;
  134. updateBottomPanelNumbers();
  135. redrawCardPanel();
  136. }
  137. private void createBottomPanel() {
  138. bottomPanel = new JPanel();
  139. bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 50, 10));
  140. bottomPanel.setBackground(Color.decode("#2E3440"));
  141. numberOfPagesLabel = createBottomLabel();
  142. numberOfCardsLabel = createBottomLabel();
  143. previousPageButton = createArrowButton("←", "vorherigen");
  144. nextPageButton = createArrowButton("→", "nächsten");
  145. nextPageButton.addActionListener(new ActionListener() {
  146. @Override
  147. public void actionPerformed(ActionEvent e) {
  148. nextPageButton.setEnabled(false);
  149. goToNextPage();
  150. nextPageButton.setEnabled(true);
  151. }
  152. });
  153. previousPageButton.addActionListener(new ActionListener() {
  154. @Override
  155. public void actionPerformed(ActionEvent e) {
  156. nextPageButton.setEnabled(false);
  157. goToPreviousPage();
  158. nextPageButton.setEnabled(true);
  159. }
  160. });
  161. bottomPanel.add(previousPageButton);
  162. bottomPanel.add(numberOfCardsLabel);
  163. bottomPanel.add(numberOfPagesLabel);
  164. bottomPanel.add(nextPageButton);
  165. }
  166. private JLabel createBottomLabel() {
  167. JLabel bottomLabel = new JLabel();
  168. bottomLabel.setForeground(Color.decode("#D8DEE9"));
  169. bottomLabel.setFont(new Font("sans-serif", Font.PLAIN, 24));
  170. return bottomLabel;
  171. }
  172. private void updateBottomPanelNumbers() {
  173. numberOfPages = kartenDeck.getDeckSize() / 24 + 1;
  174. numberOfPagesLabel.setText("Seite: " + Integer.toString(
  175. activePageNumber) + " / " + Integer.toString(
  176. numberOfPages));
  177. numberOfCards = kartenDeck.getDeckSize();
  178. numberOfCardsLabel.setText("Anzahl Karten: " + Integer.toString(
  179. numberOfCards));
  180. }
  181. private void createMasterFrame() {
  182. frame = new JFrame();
  183. frame.setTitle("Mischmaschine");
  184. frame.setLayout(new BorderLayout(10, 5));
  185. frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  186. frame.setResizable(false);
  187. frame.setVisible(true);
  188. /* spawn window centered (in floating window management mode) */
  189. frame.setLocationRelativeTo(null);
  190. BorderLayout borderLayout = new BorderLayout();
  191. borderLayout.setHgap(10);
  192. borderLayout.setVgap(10);
  193. frame.setLayout(borderLayout);
  194. }
  195. private JButton createArrowButton(String text, String pageTarget) {
  196. JButton jbutton = new JButton(text);
  197. applyNordTextTheme(jbutton);
  198. jbutton.setFocusable(false);
  199. jbutton.setToolTipText("Gehe zur " + pageTarget + " Seite der " +
  200. "Kartenanzeige");
  201. return jbutton;
  202. }
  203. public void show() {}
  204. }