JFrame problem

javaman13

Mitglied
Hallo Leute!
Ich habe ein kleines Problem, nämlich, dass ich die Klasse in der ich das .drawImage() habe einfügen will.
Wie geht das, oder besser gesagt, geht das überhaupt?

Java:
package Game;
  
import javax.swing.*;
 
public class Frame {
 
        public Frame(){
                JFrame frame = new JFrame();
                frame.add(new Level());
                frame.setTitle("GotT");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(700,365);
                frame.setVisible(true);
                frame.setLocationRelativeTo(null);
        }
        public static void main(String[] args){
                new Frame();
        }
}

Hier die zweite Klasse:
Java:
package Game;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


public class Level implements ActionListener {
	
	WorldGenerator2 g;
	Keys k;
	Timer t;

	
	Image q1, q2, q3, q4, q5, q6, q7, q8, q9, q10, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22, q23, q24, q25, q26, q27, q28, q29, q30, q31, q32;
	Image q33, q34, q35, q36, q37, q38, q39, q40, q41, q42, q43, q44, q45, q46, q47, q48, q49, q50, q51, q52, q53, q54, q55, q56, q57, q58, q59, q60;
	
	int x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, x30, x31, x32;
	int x33, x34, x35, x36, x37, x38, x39, x40, x41, x42, x43, x44, x45, x46, x47, x48, x49, x50, x51, x52, x53, x54, x55, x56, x57, x58, x59, x60;

	int y1, y2, y3, y4, y5, y6, y7, y8, y9, y10, y11, y12, y13, y14, y15, y16, y17, y18, y19, y20, y21, y22, y23, y24, y25, y26, y27, y28, y29, y30, y31, y32;
	int y33, y34, y35, y36, y37, y38, y39, y40, y41, y42, y43, y44, y45, y46, y47, y48, y49, y50, y51, y52, y53, y54, y55, y56, y57, y58, y59, y60;	
	
	int dx = k.getdx();
	int dy = k.getdy();
	
	public void timer(){
			t = new Timer(5, this);
	}
	public void geti()
	{
		q1 = g.getImage1();
		q2 = g.getImage2();
		q3 = g.getImage3();
		q4 = g.getImage4();
		q5 = g.getImage5();
		q6 = g.getImage6();
		q7 = g.getImage7();
		q8 = g.getImage8();
		q9 = g.getImage9();
		q10 = g.getImage10();
		//holt sich 60 Images aus einer anderen Klasse
	}

	public void x(){		//Definiert die x Koordinate
		x1 = 300;
		x2 = 200;
		x3 = 400;
		x4 = 300;
		x5 = 300;
		x6 = 400;
		x7 = 500;
		x8 = 500;
		x9 = 400;
		x10 = 500;
		//auch wieder für 60 Bilder
	}
	
	public void y(){			//Definiert die y Koordinate
		y1 = 300;
		y2 = 300;
		y3 = 400;
		y4 = 400;
		y5 = 500;
		y6 = 400;
		y7 = 200;
		y8 = 300;
		y9 = 500;
		y10 = 400;
		//immer noch 60 Bilder
	}
	
	public void move(){			//Macht es möglich, dass der Hintergrund sich bewegt
		x1 = x1 + dx;
		x2 = x2 + dx;
		x3 = x3 + dx;
		x4 = x4 + dx;
		x5 = x5 + dx;
		x6 = x6 + dx;
		x7 = x7 + dx;
		x8 = x8 + dx;
		x9 = x9 + dx;
		x10 = x10 + dx;
                // das ganze + dx

		y1 = y1 + dy;
		y2 = y2 + dy;
		y3 = y3 + dy;
		y4 = y4 + dy;
		y5 = y5 + dy;
		y6 = y6 + dy;
		y7 = y7 + dy;
		y8 = y8 + dy;
		y9 = y9 + dy;
		y10 = y10 + dy;
		//plus dy
	}
	
	public void paint(Graphics g2){
		Graphics2D g2d = (Graphics2D) g2;		//Sollte eigentlich alles am Bildschirm ausgeben
		
		g2d.drawImage(q1, x1, y1, null);
		g2d.drawImage(q2, x2, y2, null);
		g2d.drawImage(q3, x3, y3, null);
		g2d.drawImage(q4, x4, y4, null);
		g2d.drawImage(q5, x5, y5, null);
		g2d.drawImage(q6, x6, y6, null);
		g2d.drawImage(q7, x7, y7, null);
		g2d.drawImage(q8, x8, y8, null);
		g2d.drawImage(q9, x9, y9, null);
		g2d.drawImage(q10, x10, y10, null);
		//und dann für alle Bilder g2d.drawImage
	}
	public void actionPerformed(ActionEvent arg0) {		//Sorgt dafür, dass move und paint immer upgedated wird
		paint();
		move();
	}
}
Ja ich benutze keine ArrayList oder ähnliches für move() in Level.
Und auch ja, ich bin ein Anfänger.:p

Sorry für den langen Post
javaman
 
Zuletzt bearbeitet von einem Moderator:
Hi und willkommen im Forum
1. Dein Code ist Java, also schreib ihn doch bitte auch in java-Tags (siehe meine Signatur).

2. Zu deiner ersten Klasse: Sind das 2 verschiedene Dateien? Wenn ja, pack sie doch in 2 Code-Blöcke. Wenn nein, hast du da bereits ein paar Fehler, weil du z.B. nicht mehrere Anweisungen 'package xyz' in eine Datei packen kannst. Außerdem hast du 2 mal die gleiche Klasse in einer Datei deklariert, das willst du bestimmt nicht!

3. Es empfiehlt sich nicht, das Programmieren mit Spielen anzufangen. Vielleicht solltest du erst mal die Grundlagen lernen. Dazu solltest du dir ein Buch über Java besorgen oder http://openbook.galileocomputing.de/javainsel/ größtenteils durcharbeiten

4. Zu deinem Problem mit den Bildern: Du brauchst erst mal eine Quelle, von der du die Bilder laden willst (Dateiname, Ort im Paket / URL / …). Und dann lädt man Bilder üblicherweise mit ImageIcon oder BufferedImage (je nach Anwendungszweck), wie auch im 2. Band der JavaInsel, http://openbook.galileocomputing.de/java7/ in den Kapiteln 9.3 und 10.6 beschrieben ist.

5. Ich verstehe zwar nicht, was du machst, aber bei so vielen Bildern rentiert es sich, Arrays, Listen oder ähnliche Datenstrukturen zu verwenden. (Grundlagen)
 
Wie du natürlich nicht wissen kannst sind alle bilder schon in einer anderen klasse deklariert und werden nur in die Klasse Level geholt.

Die Grundlagen beherrsche ich durchaus, zum nachlesen für manche dinge benutze ich auch immer wieder dieses Buch(im Internet). Trotzdem konnte ich in ihm meine Rrage niht beantworten.

Mit den zwei Klassen und der trennung sollte es jetzt auch passen.

LG
javaman
 
Mit den zwei Klassen und der trennung sollte es jetzt auch passen.
Nein, dein 1. Code-Block compiliert so nicht mal. Weil du
• 2 gleichnamige Klassen in einer Datei hast
• 2 package-Deklarationen in einer Datei hast
• 2 Klassen der Sichtbarkeit 'public' in einer Datei hast
und evtl. noch ein paar andere Gründe.

Und auch der Code der 2. Klasse ist nicht Ok. Warum schreibst du beispielsweise für jedes Bild eigene Variablen, Methoden, etc.? Das ist richtig umständlich und dein Code wird so nicht wiederverwendbar, sondern sehr statisch.

Zeichnen solltest du deine Elemente in einer paintCompontent()-Methode in einer Klasse, die von JPanel erbt. Dieses JPanel musst du natürlich dem JFrame hinzufügen.
 
Oh sorry, das doppelte war ein Fehler beim einfügen, da ich zuerts nicht alles kopiert hatte.

Mit dem zweiten hast du recht, dass werde ich noch ändern müssen, da später noch andere Level dazukommen.
 
Achtung:
Du solltest zum Zeichnen die paintComponent()-Methode eines JPanels überschreiben. Das Zeichnen wird mit repaint() angestoßen. Und bewege deine Objekte doch, bevor du sie zeichnest.
 
move() vor repaint() ausführen. Und die Sachen mit dem Zeichnen sind echt Grundlagen, die du dir am besten erst mal aneignest (aus einem Buch).
 
Ich habe schon wieder ein problem:
um repaint ausführen zu können braucht man: super.paint(g)
so etwa
Java:
public void paint(Graphics g){
		super.paint(g); //das hier
		Graphics2D g2d = (Graphics2D) g;

Das problem dabei ist, das Eclipse mir folgenden Fehler schreibt:
The method paint(Graphics) is undefined for the type Object.

warum****?
 
Zuletzt bearbeitet von einem Moderator:
Zurück