package cicaprojekt; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; import java.io.IOException; /** * Az alkalmazás megjelenítéséért felelős osztály. * Inicializálja az ablak egyes részeit, illetve beállítja az eseménykezelőket. */ public class ApplicationFrame implements Runnable { /** * A fő ablakot reprezentáló JFrame példány. */ private JFrame jframe; /** * A térképválasztás alatt megjelenő tartalmat magában foglaló JPanel példány. */ private JPanel mapselectorpanel = null; /** * A játékmenet alatt megjelenő képernyőt reprezentáló * Display példány. */ private Display gamepanel; /** * A térképválasztás alatt megjelenő fájllistát * reprezentáló JScrollPane példány. */ private JScrollPane filescroll; /** * A térképválasztás alatt megjelenő menükép mérete. */ private Dimension menuDimension = new Dimension(640, 395); /** * A Control osztályban lévő KeyHandler osztály * egy példánya, amely a billentyűzet figyeléséért felel. */ private KeyListener keyHandler = new Control.KeyHandler(); /** * A fájllistából való választás eseményét kezelő osztály. * A kiválasztott elemre való kattintás után eltűnteti a térképlistát, * betölti az elemnek megfelelő térképet, majd azt felhasználva * elindítja és megjeleníti a játékot. */ private class ListMouseHandler extends MouseAdapter{ /** * A kiválaszott elemnek megfelelő térképet betölti, * majd elindítja a játékot. * * @param e a MouseEvent esemény, ameny a kattintást * reprezentálja * @see Control#ioErrorMessage() */ @Override public void mouseClicked(MouseEvent e) { jframe.remove(mapselectorpanel); File dungeonSource = ((JList) e.getComponent()).getSelectedValue(); try { setGameParams(dungeonSource); gamepanel.drawVisuals(); } catch (IOException e1) { Control.ioErrorMessage(); } jframe.add(gamepanel); jframe.pack(); } } /** * Az ablak inicializálása, alapvető tulajdonságainak beállítása. * Elindítja a térképválasztó inicializálását, illetve megjeleníti * azt. * * @see #initMapselector() */ public void init(){ jframe = new JFrame(); jframe.setFocusable(true); jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); initMapselector(); jframe.add(mapselectorpanel); jframe.pack(); jframe.setLocationRelativeTo(null); } /** * Játék után visszatérés a térképválasztáshoz. * Eltávolítja a játék nézetet, elindítja a térképválasztó * inicializálását, illetve frissíti az ablak tartalmát. * * @see #initMapselector() */ public void backToMapSelection() { jframe.remove(gamepanel); jframe.removeKeyListener(keyHandler); initMapselector(); jframe.add(mapselectorpanel); jframe.pack(); jframe.revalidate(); } /** * Megjeleníti az ablak aktuális tartalmát. */ @Override public void run() { jframe.setVisible(true); } /** * A térképválasztó inicializálása. * Amennyiben nem üres a panel, úgy kiveszi azt az ablakból. * Létrehoz egy új panelt, amelybe betölti a menüképet, majd feltölti * a térképválasztó listát is. Beállítja a térképválasztó lista * megjelenését, majd hozzákapcsol egy egér eseménykezelőt a panelhez. * Ebben lekezeli a Play gombra való kattintást, amely hatására hozzáadja * és megjeleníti a térképválasztó listát a panelhez. * * @see Control#ioErrorMessage() */ private void initMapselector() { if(mapselectorpanel != null) jframe.remove(mapselectorpanel); mapselectorpanel = new JPanel() { /** * Kirajzolja a fájlból betöltött menüképet. * * @param g egy Graphics objektum, amelyre * a rajzolófüggvény meg van hívva */ @Override protected void paintComponent(Graphics g) { super.paintComponent(g); try { g.drawImage(ImageIO.read(new File("Menu.png")), 0, 0, null); } catch (IOException ioe) { Control.ioErrorMessage(); } } }; DefaultListModel dungeonslist = new DefaultListModel<>(); File dir = new File(System.getProperty("user.dir")); FileNameExtensionFilter filter = new FileNameExtensionFilter("N/A", "dungeon"); for (File f : dir.listFiles()) { if (filter.accept(f) && f.isFile()){ dungeonslist.addElement(f); } } JList filelist = new JList<>(dungeonslist); filelist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); filelist.addMouseListener(new ListMouseHandler()); filelist.setLayoutOrientation(JList.VERTICAL); filelist.setVisibleRowCount(4); filescroll = new JScrollPane(filelist); mapselectorpanel.setMinimumSize(menuDimension); mapselectorpanel.setPreferredSize(menuDimension); mapselectorpanel.setLayout(new BorderLayout()); mapselectorpanel.addMouseListener(new MouseAdapter() { /** * Az egérrel való kattintás eseményét lekezelő függévény. * Amennyiben a megadott koordinátákon belül kattintanak * (Play gomb), úgy hozzáadja a térképválasztó listát * a panelhez, amjd frissíti a panel megjelenítését. * * @param e a MouseEvent esemény, ameny a kattintást * reprezentálja */ @Override public void mouseClicked(MouseEvent e) { if(e.getX() > 229 && e.getY() > 186 && e.getX() < 433 && e.getY() < 219) { mapselectorpanel.add(filescroll, BorderLayout.SOUTH); mapselectorpanel.updateUI(); } } }); } /** * Beállítja a játékmenet paramétereit. * Létrehoz egy új Display példányt, egy új * Dungeon példányt, amelyeket a kapott File * példánnyal együtt átad a megfelelő függvényeknek, amelyek aztán * elindítják a játékmenetet. * * @param dungeonFile az a File, amelyet a felhasználó * a térképválasztóból választott ki * @throws IOException Ha nem találja a bemeneti fájlokat. * @see Game#setDisplay(Display) * @see Game#setDungeon(Dungeon) * @see Game#startGame(File) */ private void setGameParams(File dungeonFile) throws IOException { gamepanel = new Display(); Game.instance.setDisplay(gamepanel); Game.instance.setDungeon(new Dungeon()); Game.instance.startGame(dungeonFile); jframe.addKeyListener(keyHandler); } }