Einen wunder schönen guten Tag,
Ich habe ein mehr oder weniger kleines Problem (ich weis nicht wie groß XD):
Ich habe ein Hauptfenster und eine Klasse map. In der Klasse map wird die Karte für das Spiel gespeichert, und die Operationen für die Karte zu verfügung gestellt.
Nun möchte ich aus dem Hauptfenster die Karte laden. Da dies aber sehr lange dauern kann, möchte ich dieses in ein extra Thread auslagern, damit die GUI nicht gespert wird und ich ein ProgressMonitor verwenden kann.
Jedoch bekomme ich das nicht so ganz hin, dass ich die Methode in einem extra Thread ausgeführt wird. Desweitern müsste dieser Thread auf eine Variable aus dem Hauptfenster zugreiffen können und die Karte als Rückgabewert zurückgeben. Wie bekomme ich dies hin?
Ich habe versucht die Klasse map mit Runnable zu erweitern, aber dies ist ja nicht ganz mein Ziel oder?! Da ja so die ganze Karte als eignes Thread läuft, kann ich doch späte Probleme bei den Animmationen bekommen, da ich ja die Frame- bzw. Delta-Zeiten aus den Hauptfenster beachten muss, oder?
Das Hauptfenster:
Die Karte:
mfg. Dagobert
Ich habe ein mehr oder weniger kleines Problem (ich weis nicht wie groß XD):
Ich habe ein Hauptfenster und eine Klasse map. In der Klasse map wird die Karte für das Spiel gespeichert, und die Operationen für die Karte zu verfügung gestellt.
Nun möchte ich aus dem Hauptfenster die Karte laden. Da dies aber sehr lange dauern kann, möchte ich dieses in ein extra Thread auslagern, damit die GUI nicht gespert wird und ich ein ProgressMonitor verwenden kann.
Jedoch bekomme ich das nicht so ganz hin, dass ich die Methode in einem extra Thread ausgeführt wird. Desweitern müsste dieser Thread auf eine Variable aus dem Hauptfenster zugreiffen können und die Karte als Rückgabewert zurückgeben. Wie bekomme ich dies hin?
Ich habe versucht die Klasse map mit Runnable zu erweitern, aber dies ist ja nicht ganz mein Ziel oder?! Da ja so die ganze Karte als eignes Thread läuft, kann ich doch späte Probleme bei den Animmationen bekommen, da ich ja die Frame- bzw. Delta-Zeiten aus den Hauptfenster beachten muss, oder?
Das Hauptfenster:
Code:
public class MapEditor extends JPanel implements Runnable {
public void loadMap() {
JFileChooser fc = new JFileChooser("resourcen/maps/");
fc.setDialogTitle("Karte wählen");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
fc.setAcceptAllFileFilterUsed(false);
fc.setFileFilter(new javax.swing.filechooser.FileFilter() {
public boolean accept(File f) {
return f.isDirectory()
|| f.getName().toLowerCase().endsWith(".mapi");
}
public String getDescription() {
return "map(*.mapi)";
}
});
int returnvalue = fc.showOpenDialog(null);
if (returnvalue == JFileChooser.APPROVE_OPTION) {
File selecteFile = fc.getSelectedFile();
System.out.println("Karte wird geladen");
map = map.loadMap(selecteFile.getAbsolutePath());
}
}
}
Die Karte:
Code:
public class Map{
private String name; // Name der Karte
private String author; // Autor der Karte
private String description; // Beschreibung der Karte selbst
private long height; // Aktuelle Höhe der Karte
private long width; // Aktuelle Breite der Karte
private HashMap<Integer, Tile> availableTiles; // Verfügbare Tiles werden gespeichert
private Vector<Tile> tiles; // Speicher für die Tiles der Karte
private Vector<Objects> objects; // Speicher für die Objekte der Karte
//Hauptkonstruktor, der immer alle Atribute erwartet
public Map(int height, int width, String name, String author, String description, Vector<Tile> tiles){
setHeight(height);
setWidth(width);
setName(name);
setAuthor(author);
setDescription(description);
copyTile(tiles);
availableTiles = new HashMap<Integer, Tile>();
tiles = new Vector<Tile>();
}
public Map(){
this(10, 10 , "", "", "", new Vector<Tile>());
}
public Map(int height, int width){
this(height, width, "", "", "", new Vector<Tile>());
}
public Map(int height, int width, Vector<Tile> tiles){
this(height, width, "", "", "", tiles);
}
public Map loadMap(String openFile){
System.out.println(openFile);
FileReader fr = null;
Map map = new Map();
try {
fr = new FileReader(openFile);
} catch (FileNotFoundException e) {
System.out.println("Karte konnten nicht geladen oder gefunden werden");
e.printStackTrace();
return null;
}
try {
Document xml = new SAXBuilder().build(fr);
Element root= xml.getRootElement();
Element eigenschaften = root.getChild("eigenschaften");
Element tilesInfo = root.getChild("tiles");
map.setName(eigenschaften.getAttributeValue("name"));
map.setAuthor(eigenschaften.getAttributeValue("autor"));
map.setDescription(eigenschaften.getAttributeValue("beschreibung"));
map.setWidth(eigenschaften.getAttribute("breite").getLongValue());
map.setHeight(eigenschaften.getAttribute("hoehe").getLongValue());
File f = new File("./resourcen/tiles/");
String[] filenames = f.list(new FilenameFilter(){
public boolean accept(File dir, String name){
return name.endsWith(".ttr");
}});
for(int i = 0; i < filenames.length; i++){
Tile tile = new Tile();
tile = tile.loadTile("./resourcen/tiles/" + filenames[i]);
map.availableTiles.put(tile.getID(),tile);
}
for(int i = 1; i <= tilesInfo.getAttribute("anzahl").getLongValue();i++){
Element currentTileInfo = tilesInfo.getChild("t"+i);
Tile tile = map.availableTiles.get(currentTileInfo.getAttribute("id").getIntValue());
tile.setPosition(currentTileInfo.getAttribute("xpos").getIntValue(), currentTileInfo.getAttribute("ypos").getIntValue());
addTile(tile);
}
} catch (JDOMException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
return map;
}
}
mfg. Dagobert