Leveldesignausgabe

Guten Abend liebes Java-Forum :)

Ich bin momentan dabei meine Fertigkeiten im Bereich GUI zu verbessern, habe jedoch noch nie mit Bildern bei Java gearbeitet. Prompt ein bisschen in Google gesucht und auf die sogenannte drawImage-Methode getroffen - Erschien mir logisch, da ich zuvor bereits mit drawRect und drawString gearbeitet habe. Dennoch möchte er mir das Feld nicht so wirklich ausgeben /:

Java:
package Code;
import java.awt.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
public class Levelpanel extends JPanel {
	String level = "132234";
	int xpos = 100;
	public Levelpanel(){
		setSize(500, 500);
		setVisible(true);
	}
	
	public void paint(Graphics g){
		super.paint(g);
		g.setColor(Color.RED);            //Visualisierung: Paint-Methode wird aufgerufen und funktioniert
		g.fillOval(20, 20, 20, 20);
	
		for(int i = 0; i < level.length(); i++){
			char frame = level.charAt(i);
			switch(frame){
			case 1:
				try {
					Image image1 = ImageIO.read(new File("Medien\\boden.png"));
					g.drawImage(image1, xpos, 50, null); //Ich kenne die Methode nicht - Richtig?!
				} catch (IOException e) {
					System.out.println("Datei nicht gefunden");
				}
				xpos += 20;
				repaint();
				break;
			case 2:
				try {
					Image image1 = ImageIO.read(new File("Medien\\drache1.png"));
					g.drawImage(image1, xpos, 50, this);
				} catch (IOException e) {
					System.out.println("Datei nicht gefunden");
				}
				xpos += 20;
				repaint();
				break;
			case 3:
				try {
					Image image1 = ImageIO.read(new File("Medien\\feuerball.png"));
					g.drawImage(image1, xpos, 50, this);
				} catch (IOException e) {
					System.out.println("Datei nicht gefunden");
				}
				xpos += 20;
				repaint();
				break;
			case 4:
				try {
					Image image1 = ImageIO.read(new File("Medien\\tuer.png"));
					g.drawImage(image1, xpos, 50, this);
				} catch (IOException e) {
					System.out.println("Datei nicht gefunden");
				}
				xpos += 20;
				repaint();
				break;
			}
		}
	}
}


Java:
package Code;
import java.awt.*;
import javax.swing.*;
public class LevelFrame extends JFrame {
	String level ="2231";
	int xpos = 100;
	public LevelFrame(String title){
		super(title);
		setVisible(true);
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Levelpanel p = new Levelpanel();
		add(p);
	}
	
	public static void main(String[] args){
		LevelFrame f = new LevelFrame("Spiel?!");
	}
}


Sinn meines vorherigen Plans: Ein Panel im Frame erstellen und dann das Frame in der Methode aufrufen. Dass die Ausgabe der Frames nicht akurat werden könnte, ist mir bewusst. Aber erst einmal würde ich überhaupt gerne ein Bildchen sehen /:

MfG
 
Zuletzt bearbeitet:

Bartertown

Mitglied
Hi,

das hab ich auch schon gehabt,
probier es mal mit:
ImageIO.read(getClass.getRessource("myFolder/myImage.png"));

Ansonsten sollte die paintComponent()-Methode zum Zeichnen überschrieben werden, weil die paint-Methode auch noch den Rahmen und Alles zeichnet...

Gruß
 

turtle

Top Contributor
Du hast mehrere Fehler/Probleme in deinem Code.

Erstes und grösstes Problem ist, das du die Variable xpos nicht korrekt setzt.
Zweites Problem ist, das du nicht korrekt auf den Integer-Wert des Levels reagierst.

Problem ist, das du praktisch den gleichen Code für drei Bilder ausführst. Das ist schlechter Stil und das solltest du ändern.

Zweitens ist das Laden einen Images vom Dateisystem doof, weil es nicht mehr geht, wenn du alles in eine JAR packst.

Grundsätzlich verstehe ich aber nicht, warum du überhaupt IM JPanel rummalst? Das ist erstens schlecht zu debuggen, da ja jedesmal wieder paint() aufgerufen wird. Zweitens zeigst du "nur" Bilder an, was man auch mit JLabel machen könnte. Aber vielleicht verstehe ich dich hier nicht richtig.

Ich habe mal es abgeändert

imp
Java:
ort java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Levelpanel extends JPanel {
    String level = "132234";

    public Levelpanel() {
	setSize(500, 500);
	setVisible(true);
    }

    public void paint(Graphics g) {
	int xpos = 100;
	super.paint(g);
	g.setColor(Color.RED);
	g.fillOval(20, 20, 20, 20);

	for (int i = 0; i < level.length(); i++) {
	    int frame = Character.digit(level.charAt(i), 10);
	    switch (frame) {
	    case 1:
		try {

		    Image image1 = ImageIO.read(getClass().getResourceAsStream("/images/boden.png"));
		    g.drawImage(image1, xpos, 50, null);
		} catch (IOException e) {
		    e.printStackTrace();
		}
		xpos += 40;
		repaint();
		break;
	    case 2:
		try {
		    Image image1 = ImageIO.read(getClass().getResourceAsStream("/images/drache.png"));
		    g.drawImage(image1, xpos, 50, this);
		} catch (IOException e) {
		    e.printStackTrace();
		}
		xpos += 40;
		repaint();
		break;
	    case 3:
		try {
		    Image image1 = ImageIO.read(getClass().getResourceAsStream("/images/feuerball.png"));
		    g.drawImage(image1, xpos, 50, this);
		} catch (IOException e) {
		    e.printStackTrace();
		}
		xpos += 20;
		repaint();
		break;
	    case 4:
		try {
		    Image image1 = ImageIO.read(getClass().getResourceAsStream("/images/tür.png"));
		    g.drawImage(image1, xpos, 50, this);
		} catch (IOException e) {
		    e.printStackTrace();
		}
		xpos += 40;
		repaint();
		break;
	    }
	}
    }

    public static void main(String[] args) {
	JFrame frame = new JFrame("");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	JPanel panel = new Levelpanel();
	frame.add(panel);
	frame.pack();
	frame.setVisible(true);
    }
}
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    9,8 KB · Aufrufe: 26
Hallo ihr beiden :D

Ja, der schlechte Stil ergibt sich wohl dadurch, dass ich da echt noch auf einer häuprigen Grundlage stehe. Sollte man denn nicht im Panel rummalen? Ist es nicht Sinn der Sache, dass man alles graphische auf dem Panel darstellt und dieses dann dem Frame hinzufügt?

Und dake für die Codevorschläge/-Verbesserungen!

MfG
 

turtle

Top Contributor
Ist es nicht Sinn der Sache, dass man alles graphische auf dem Panel darstellt und dieses dann dem Frame hinzufügt?
Na ja, das kommt drauf an;)

Alle "normalen" Widgets wie JLabel, JButton, JTextArea etc. malen sich selber.

Dazu kann man sich die GUI zusammenbauen und ein Layout-Manager kümmert sich darum, die Widgets geeignet im verfügbaren Screen-Space anzuordnen.

Auf ein JPanel "malen" macht man dann, wenn es kein Widget gibt, das dieses übernimmt. Ein Beispiel ist ein Malprogramm in dem man mit der Maus Zeichenobjekte anlegen kann und diese folglich selber zeichnen muss.
 
Erstmal großen Dank dafür - Funktioniert :D

Ja, so hatte ich es eigentlich auch immer verstanden ^^

JFrame = Buttons, JMenuBars usw.
JPanel = selbstkreiertes also Bilder, fillRect usw.

MfG
 
So letzte Frage und ganz großes Sorry wegen DP D:

Java:
package Code;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
     
    public class LevelFrame extends JPanel {

		public LevelFrame() {
        setSize(500, 500);
        setVisible(true);
        }
     
        public void paint(Graphics g) {
        	try {
            int xpos = 100;
            int ypos = 50;
            String level ="";
			BufferedReader in = new BufferedReader(new FileReader("src//Medien//level_example.txt"));
	        while((level = in.readLine()) != null){
	        	System.out.println(level);
	        	for (int i = 0; i < level.length(); i++) {
		                char frame = level.charAt(i);
		                switch (frame) {
				             case '0':
				                try {
				         
				                    Image image1 = ImageIO.read(getClass().getResourceAsStream("/Medien/wand.png"));
				                    g.drawImage(image1, xpos, ypos, null);
				                } 
				                catch (IOException e) {
				                    e.printStackTrace();
				                }
				                xpos += 32;
				                repaint();
				                break;
				            case '1':
				                try {
				                    Image image1 = ImageIO.read(getClass().getResourceAsStream("/Medien/boden.png"));
				                    g.drawImage(image1, xpos, ypos, this);
				                } 
				                catch (IOException e) {
				                    e.printStackTrace();
				                }
				                xpos += 32;
				                repaint();
				                break;
				            case '2':
				                try {
				                    Image image1 = ImageIO.read(getClass().getResourceAsStream("/Medien/schluessel.png"));
				                    g.drawImage(image1, xpos, ypos, this);
				                } 
				                catch (IOException e) {
				                    e.printStackTrace();
				                }
				                xpos += 32;
				                repaint();
				                break;
				            case '3':
				                try {
				                    Image image1 = ImageIO.read(getClass().getResourceAsStream("/Medien/tuer.png"));
				                    g.drawImage(image1, xpos, ypos, this);
				                } 
				                catch (IOException e) {
				                    e.printStackTrace();
				                }
				                xpos += 32;
				                repaint();
				                break;
				        	case '4':
				                try {
				                    Image image1 = ImageIO.read(getClass().getResourceAsStream("/Medien/spieler.png"));
				                    g.drawImage(image1, xpos, ypos, this);
				                	} 
				                catch (IOException e) {
				                    e.printStackTrace();
				                	}
				                xpos += 32;
				                repaint();
				                break;
						    case '5':
					            try {
					                    Image image1 = ImageIO.read(getClass().getResourceAsStream("/Medien/drache1.png"));
					                    g.drawImage(image1, xpos, ypos, this);
					                } 
					            catch (IOException e) {
					                    e.printStackTrace();
					                }
					                xpos += 32;
					                repaint();
					                break;
				                }
	        				}
	        			xpos = 100;
	        			ypos += 32;
	        		}
	       		in.close();
        	}
		catch (Exception e1) {
			e1.printStackTrace();
        super.paint(g);
        g.setColor(Color.RED);
        g.fillOval(20, 20, 20, 20);
			}
        }
     
        public static void main(String[] args) {
        JFrame frame = new JFrame("");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        LevelFrame f = new LevelFrame();
        frame.add(f);
        frame.pack();
        frame.setVisible(true);
        }
    }

Zur Aufklärung: Die Textdatei level_example.txt enthält Stringzeichen, die angeordnet dastehen und verarbeitet werden soll: Bsp:

0000100000
0001110000
0001010000
0001010000
................

Am Beispiel 0 = Wand, 1 = Boden

So war unsere Aufgabe im Programmierkurs damals gestellt. Problem nun: Trotz while ((level = in.readLine()) != null) haut der mir eine Endlosschleife raus, obwohl die Ausgabe dann nach 16 Zeilen enden sollte, weil da gar nix kommt. Die Ausgabe des Levels an sich funktioniert, nur dann tauchen darunter wieder x-andere Framegebilde auf. Ich hab zur Verdeutlichung der Endlosschleife mal ein System.out.println unter die While-Schleife gepackt. Übersehe ich etwas banales? o_O
Und ist der Zugriff auf die txt_datei so richtig? Ich wurde ja vorhin darauf hingewiesen, dass es da zu Problemen kommen könnte, wenn man das in eine Jar-Datei packt.

MfG
 

Neue Themen


Oben