cicaprojekt/cicaprojekt/ApplicationFrame.java

231 lines
7.6 KiB
Java

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ó <code>JFrame</code> példány.
*/
private JFrame jframe;
/**
* A térképválasztás alatt megjelenő tartalmat magában foglaló <code>JPanel</code> példány.
*/
private JPanel mapselectorpanel = null;
/**
* A játékmenet alatt megjelenő képernyőt reprezentáló
* <code>Display</code> példány.
*/
private Display gamepanel;
/**
* A térképválasztás alatt megjelenő fájllistát
* reprezentáló <code>JScrollPane</code> 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 <code>Control</code> osztályban lévő <code>KeyHandler</code> 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 <code>MouseEvent</code> esemény, ameny a kattintást
* reprezentálja
* @see Control#ioErrorMessage()
*/
@Override
public void mouseClicked(MouseEvent e) {
jframe.remove(mapselectorpanel);
File dungeonSource = ((JList<File>) 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 <code>Graphics</code> 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<File> 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<File> 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 <code>MouseEvent</code> 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 <code>Display</code> példányt, egy új
* <code>Dungeon</code> példányt, amelyeket a kapott <code>File</code>
* 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 <code>File</code>, 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);
}
}