Bild zeichnen

timestamp

Mitglied Käsekuchen
Hallo Forum

vielleicht liegt es an der Uhrzeit oder einfach daran, dass ich noch nicht so viel Java Erfahrung gesammelt habe, aber ich versuche hier jetzt schon seit Ewigkeiten ein Bild zeichnen zu lassen (und dass zu aktualisieren). Nur bekomme ich überhaupt gar nichts angezeigt. Auch die Kontrollausgabe wird nicht getätigt. Ich erhalte auch keine Fehlermeldungen. Ich benutze eclipse unter Win7.


Die Klasse Game startet einen Thread, der im JFrame ein Bild malen soll. Dazu ruft der Thread die Methode der Klasse Map auf, wovon ein Objekt in Game angelegt wurde.

Der Code:
Java:
public class Map extends JComponent {	
    Image img;
	Map(String map, int startX, int startY){
		this.img = Toolkit.getDefaultToolkit().getImage( "./gamedata/images/tiles/tile01.png" );
	}
	
	public void displayMapTiles(){
		 repaint(); 
	}
	
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		System.out.println("AUFGERUFEN");
		g.drawImage(img, 50, 50, Game.window);
	}
}

public class Game extends JFrame implements GameConstants {	
	static JFrame window;	
	static Map	  map;
	
	public static void main(String[] args){
		Game game = new Game(); //starting a new game
		
		/* creating the window*/
		window = new JFrame();
		window.setTitle(STR_GAMENAME+" "+STR_GAMEVERSION);
		window.setSize(INT_GAMEWIDTH, INT_GAMEHEIGHT);		
		window.setLayout(null);
		window.setResizable(false);
		window.setLocation(100,100);
		window.setBackground(new Color(100, 100, 100));		
		window.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		window.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent evt){
				menu.quit();						
			}
		});
		window.addKeyListener(new KeyAdapter(){
			public void keyPressed(KeyEvent evt){
				Game.handleKeyDownEvent(evt.getKeyCode());
			}
		});
		map = new Map("castle", 50, 50);
		window.add(map);
		window.setVisible(true);
		
		menu = new Menu(); //starting the menufunctions
		//map  = new Map("castle", 0, 0);
		GameThread gt = new GameThread();
		Thread t = new Thread(gt);
		t.start();
	}
}


public class GameThread implements Runnable{
	public void run(){
		//Draw
		while(true){			
			try{
				Game.map.displayMapTiles();
				Thread.sleep(40);
			}
			catch(Exception e){
				String content = "Error: "+e.getMessage();
				String title   = "Error";
				Object[] options = {"Continue", "Quit program"};
				if( Game.MessageBox(Game.window, content, title, options, 0, JOptionPane.ERROR_MESSAGE) == 1)
					System.exit(0);
			}
		}
	}
}


Ich habe (so denke ich) unwichtigen Code herausgelassen. Deswegen scheinen einige Variablen/Funktionen jetzt nicht vorzukommen. Wenn die trotzdem benötigt werden bitte nachfragen :)
 
Huhu,

Meine erste Rückfrage betrifft dein Layout. Auf deinem window rufst du setLayout(null), was demnach für alle enthaltenen Komponenten eine pixelgenaue Positionierung erfordert, die allerdings für deine Map nicht stattfindet.

Ansatz:
  • Entweder für die Map setBounds() aufrufen, oder
  • Im Window einen anständigen LayoutManager einsetzen und dann beim Hinzufügen deiner Map entsprechende Layout-Informationen mitgeben.

Ich bin auf jeden Fall für die zweite Variante, da das Null-Layout wirklich nur in Ausnahmen angewandt werden sollte, obgleich das bei dir sogar möglich ist, da du ja window.setResizable(false) machst. Nichtsdestotrotz plädiere ich für einen ordentlichen LayoutManager. Welche da für dich geeignet wäre kann ich - ohne zusätzliche Kenntnisse über deine übrigen GUI-Komponenten - nicht wirklich sagen.


Viele Grüße
Carron
 
Hi

da das ganze ein Spiel werden soll, sind pixelgenaue Positionierungen auf jeden Fall notwendig. Übrige GUI Komponenten sind noch nicht vorhanden, da ich erstmal den Hintergrund anlegen wollte ;)

edit: Ich habe es jetzt noch so versucht, aber das Bild wird nicht gezeichnet:
Java:
map.setLocation(50,50);

edit 2: Als übrige GUI-Komponenten sind Buttons/Textfelder möglich, allerdings sind bzw sollen diese auch nach belieben verschiebbar sein ;)
 
Zuletzt bearbeitet:
Dein Code funktioniert eigentlich, aber du hast vergessen die Position und Größe von dem Map-Objekt festzulegen, daher wurde auch nix gezeichnet.

Ich habe mir mal erlaubt die eine oder andere Stelle anzupassen.

Der Code:
Java:
package de.tutorials.timestamp;

import java.awt.Color;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

public class Game extends JFrame {// implements GameConstants {
	static Map					map;
	private static final long	serialVersionUID	= 5731534582682001021L;
	static JFrame				window;

	public static void main(String[] args) {
		new Game();

		/* creating the window */
		window = new JFrame();
		// window.setTitle(STR_GAMENAME + " " + STR_GAMEVERSION);
		// window.setSize(INT_GAMEWIDTH, INT_GAMEHEIGHT);
		window.setLayout(null);
		window.setResizable(false);
		window.setLocation(100, 100);
		window.setSize(500, 500);
		window.setBackground(new Color(100, 100, 100));
		window.setDefaultCloseOperation(EXIT_ON_CLOSE);
		//window.setDefaultCloseOperation(Do_NOTHING_ON_CLOSE);
		window.addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent evt) {
				// menu.quit();
			}
		});
		window.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent evt) {
				// Game.handleKeyDownEvent(evt.getKeyCode());
			}
		});
		map = new Map("castle");
		map.setLocation(50, 50);
		map.setSize(300, 300);
		window.add(map);
		window.setVisible(true);

		GameThread gt = new GameThread();
		Thread t = new Thread(gt);
		t.start();
	}
}

package de.tutorials.timestamp;

import javax.swing.SwingUtilities;

public class GameThread implements Runnable {
	@Override
	public void run() {
		// Draw
		while(true) {
			try {
				// Da Grafikverarbeitung lieber abwarten, bis alle Events
				// verarbeitet wurden
				SwingUtilities.invokeLater(new Runnable() {
					@Override
					public void run() {
						Game.map.displayMapTiles();
					}
				});
				Thread.sleep(40);
			} catch(Exception e) {
				// String content = "Error: " + e.getMessage();
				// String title = "Error";
				// Object[] options = {"Continue", "Quit program"};
				// if(Game.MessageBox(Game.window, content, title, options, 0,
				// JOptionPane.ERROR_MESSAGE) == 1) System.exit(0);
			}
		}
	}
}

package de.tutorials.timestamp;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;

import javax.swing.JComponent;

public class Map extends JComponent {
	private static final long	serialVersionUID	= -7740513721210254220L;

	private Image				img;

	public Map(String map) {
		img = getToolkit().getImage("/home/link/Bilder/bild.jpg");
		
		// Warten, bis das Bild geladen wurde
		MediaTracker mt = new MediaTracker(this);
		mt.addImage(img, 0);
		try {
			mt.waitForAll();
		} catch(InterruptedException e) {
			e.printStackTrace();
		}
	}

	public void displayMapTiles() {
		repaint();
	}

	@Override
	public void paintComponent(Graphics g) {
		System.out.println("AUFGERUFEN");
		g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
	}
}

Ein paar Sachen musste ich auskommentieren, da ich nicht deine Komponenten habe, aber die kannste ja dann wieder einfügen.

Tja, an solchen kleinen Fehlern sitzt man manchmal länger als man denkt ;)
 
Super genial :) Ich habe es jetzt an meine Bedürfnisse angepasst und es läuft 1a.
Besten Dank! Du hast meinen Tag gerettet :D
 

Neue Beiträge

Zurück