Zu viele Fenster - HILFE!

Toastbot

Mitglied
Ich hab ein Problem und ich kapiere einfach meinen Fehler nicht.
Ich habe ein Skript genommen was ein Fenster erstellt, auf dem ich dann (später) ein spiel aufbaue nach und nach. Nur anstatt EIN Fenster zu erstellen wie in meiner Vorherigen Version ohne Probleme, erstellt das Programm jetzt unendlich viele Fenster... HILFE!

Hier das Script welches ich ausführe:
Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;


public class Game {

	private JFrame frame;
	int time;
	Graphics2D g2d;
	int meter = 32;
	int rasterX = 16;
	int rasterY = 16;
	int dimX = rasterX*meter;
	int dimY = rasterY*meter;
	int x=1;
	int y=1;

	public Game() {
		frame = new JFrame("Catch the ball!");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationByPlatform(true);
		MovePanel panel = new MovePanel();
		frame.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_UP) {
				}
			}
		});

		frame.add(panel);

		Timer look = new Timer(500, panel);
		look.setRepeats(true);
		look.start();

		frame.pack();
		frame.setVisible(true);

	}
	public static void main(String[] args) {		
		new Game();
	}
	class MovePanel extends JPanel implements ActionListener {
		private static final long serialVersionUID = 1L;
		private int counter;
		public MovePanel() {

			super();
			counter = 0;
		}
		public Dimension getPreferredSize() {

			return new Dimension(dimX, dimY);

		}
		public void paintComponent(Graphics g) {

			g2d = (Graphics2D) g;

			Charakter charakter = new Charakter();
			charakter.drawMe(x, y, g2d);

		}
		public void actionPerformed(ActionEvent e) {
			setState(counter);
			counter = (counter % 10) + 1;
		}
		private void setState(int i) {
			if(i %2 == 1) {
				time+=1;
			}
			else {
				time+=1;
			}

			repaint();

		}
	}
}
Hier die zwei eigentlich wichtigen Parts(Aus dem obigem Script):
Java:
public Dimension getPreferredSize() {

			return new Dimension(dimX, dimY);

		}
		public void paintComponent(Graphics g) {

			g2d = (Graphics2D) g;

			Charakter charakter = new Charakter();
			charakter.drawMe(x, y, g2d);

		}

Hier meine Unterklasse, die anscheinend das Problem verursacht!
Java:
import java.awt.Color;
import java.awt.Graphics;


public class Charakter extends Game {
	
	public void drawMe(int mX, int mY, Graphics g2d){
		g2d.setColor(new Color(Integer.parseInt("EEC591", 16)));
		g2d.fillOval(mX*meter, mY*meter, meter-1, meter-1);
	}

}
 
Deine logik ist totaler Murx:

Java:
public void paintComponent(Graphics g) {
 
            g2d = (Graphics2D) g;
 
            Charakter charakter = new Charakter();
            charakter.drawMe(x, y, g2d);
 
        }
und
Java:
Charakter extends Game

Jedesmal wenn du einen Charakter erstellst, erstellst du ein neues Fenster, da dieser von Game erbt.
Dann machst du das auch noch in der paintComponent Methode... die wird "ständig" aufgerufen.
 
Gut, soweit verstanden.
Ich hatte das "erben" eher auf werte verstanden und weniger auch auf das erstellen meiner Oberfläche.
Ich würde jetzt eine Klasse erstellen die ich "Variablen" nenne, da pack ich alle variablen rein, und lass dann game und charakter von variablen "erben". So sollte das gehen denke ich.

Danke, und falls ich grad wieder ein Gedankenfehler habe gerne korrigieren.
 
Wie mein Vorposter bereits erwähnt hat ist die Logik wirklich nicht gut. Ein Charakter hat nun wirklich nichts gemeinsam mit der Game Klasse (Außer evtl. das er im Spiel vorkommt). Eventuell wäre es angebracht eine Superklasse Entity zu schreiben von der Charakter dann erben kann und die eben alle Allgemeinen Eigenschaften für "Dinge" in deinem Spiel verwaltet.

Alternativ dazu (nicht zu empfehlen) müsstest du den Konstruktor in Game nur mit einem Parameter ausstatten, weil der implizite super()-Aufruf im Konstruktor von Charakter sich immer auf den Standardkonstruktor der Superklasse bezieht (also ohne Parameter).

EDIT: Die Klasse Variablen zu nennen und da einfach alles reinzupacken ist erst recht Murks. Superklassen sollten immer Eigenschaften und Methoden bündeln die auch wirklich im Zusammenhang mit den Subklassen stehen. Eine Superklasse Wesen(Entity) wäre da schon besser von der Namenswahl her. Diese Klasse könnte dann alle Eigenschaften zusammenfassen die Wesen in deiner Spielwelt haben sollten.
 
Zuletzt bearbeitet:
Ok, nehmen wir an ich erstelle eine "Objekte" Klasse, die ein Grundgerüst für alle meine Objekte darstellt,
dann müssten sich darin Sachen wie xKordinate, yKordinate und "Feld Blockiert" befinden.
Klingt soweit gut für mich 🙂
Ich würde das jetzt mal ausprobieren und mich eventuell morgen nochmal melden, falls sich weitere Probleme bezüglich des "erbens" ergeben ^^.

Danke soweit für die guten Tipps 🙂
 
Ok, nehmen wir an ich erstelle eine "Objekte" Klasse, die ein Grundgerüst für alle meine Objekte darstellt,
dann müssten sich darin Sachen wie xKordinate, yKordinate und "Feld Blockiert" befinden.
Klingt soweit gut für mich 🙂
Ich würde das jetzt mal ausprobieren und mich eventuell morgen nochmal melden, falls sich weitere Probleme bezüglich des "erbens" ergeben ^^.

Danke soweit für die guten Tipps 🙂

Ich würde an deiner stelle das ganze noch ein wenig umgauben wenn das Game nacher größer wird, also dass du deinen KeyListener in eine externe Klasse auslagerst und das erstellen des Frames auch noch und die Game-Klasse dann nur die Unterklassen aufruft und die Klasse die das Frame/Fenster erstellt aufruft und natürlich auch das rendern und das tick System. Wobei du die render Methode noch in weiteren Klassen verwenden kannst und dann in der render Methode deiner Game Klasse diese aufrufst. Dies wird besonders nützlich wenn du dann eine Entity-Klasse hast aus den alle Charactere erben.
Ich habe dies z.B. so gelöst:

Java:
package de.minecraftplaye.bdh.window;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.util.Random;

import de.minecraftplaye.bdh.framework.KeyInput;
import de.minecraftplaye.bdh.framework.ObjectID;
import de.minecraftplaye.bdh.objects.Player;

public class Game extends Canvas implements Runnable
{
	
	private static final long serialVersionUID = -1L;

	private boolean running = false;
	private Thread thread;
	
	public static int WIDHT, HEIGHT;
	
	// Object
	Handler handler;
	
	Random rand = new Random();
	
	private void init()
	{
		WIDHT = getWidth();
		HEIGHT = getHeight();
		
		handler = new Handler();
		
		handler.addObject(new Player(100, 100, handler, ObjectID.Player));
		
		handler.createLevel();
		
		this.addKeyListener(new KeyInput(handler));
	}
	
	public synchronized void start()
	{
		if(running)
			return;
		
		running = true;
		thread = new Thread(this);
		thread.start();
	}
	
	public void run()
	{
		init();
		this.requestFocus();
		// your code
	}
	
	private void tick()
	{
		handler.tick();
	}
	
	private void render()
	{
		BufferStrategy bs = this.getBufferStrategy();
		if(bs == null)
		{
			this.createBufferStrategy(3);
			return;
		}
		
		Graphics g = bs.getDrawGraphics();
		
		//////////////////////////////////
		
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, getWidth(), getHeight());
		
		handler.render(g);
		
		//////////////////////////////////
		
		g.dispose();
		bs.show();
	}
	
	public static void main(String[] args)
	{
		new Window(800, 600, "XXXX", new Game());
	}
}
Java:
package de.minecraftplaye.bdh.window;

import java.awt.Dimension;

import javax.swing.JFrame;

public class Window
{
	
	public Window(int w, int h, String title, Game game)
	{
		game.setPreferredSize(new Dimension(w, h));
		game.setMaximumSize(new Dimension(w, h));
		game.setMinimumSize(new Dimension(w, h));
		
		JFrame frame = new JFrame(title);
		frame.add(game);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		
		game.start();
	}
}
 
Zuletzt bearbeitet:

Zurück
Oben