viele Canvas auf einem Panel und das GUI schmiert ab

Status
Nicht offen für weitere Antworten.
Servus,

ich hab da ein kleines Problem. Wir sollen für die Uni MineSweeper nachbauen, wie man das aus Windows kennt. Leider alles mit AWT-Komponenten, Swing kommt erst nächstes Mal dran. Wir haben uns überlegt, grau in grau wie im Original ist langweilig, also wollten wir Bilder einbauen. Also ist jedes Kästchen halt von der Klasse Canvas abgeleitet.

Wenn nun ein neues Spielfeld erstellt wird, werden diese ganzen Canvas-Objekte erstellt, mit setBounds() deren Position festgesetzt und dann per NullLayout auf einem Panel platziert. Das Problem:

Wählt man eine Feldgröße mit z.B. 50x50 aus oder erstellt man 2 mal ein Profi-Spiel (30x16), dann sieht man noch, wie einige der Canvas-Objekte auf dem Spielfeld erscheinen, dann ist aber Schluss. Das Prog stürzt ab, und nimmt, wenn nicht gleich ganz Windows weg ist, auch den Eclipse mit.

Alle "alten" Objekte werden aber vor einem neuen Spiel von allen Referenzen befreit, das heißt, der GarbageCollector könnte sie wegräumen.

Mitlweile haben wir es umgeschrieben, dass bei einem neuen Spiel mit alter Größe die Objekte nur umsortiert werde, also setBounds() wird aufgerufen, neue Koordinaten und dann repaint(). Das geht ohne Probleme.

Es werden auch alle add()-Aufrufe für alle Komponenten ausgeführt.

Im TaskManager sehe ich, dass das Prog immer knapp 20MB Speicher braucht, fast unabhängig von der Spielfeldgröße.

Alle Bilder werden mit .getImage() erzeugt, nicht mit createImage().



Hat jemand ne Idee, woran das liegt? Oder womit ich das verhindern könnte?

Vielen Dank für die Mühe,
MfG, Tim
 
S

stev.glasow

Gast
Nimmst du für jedes Feld ne extra Canvas? Es reicht doch wenn du alles auf eine zeichnest .
 
Jau, für jedes Feld ein eigenes, das macht das ganze etwas übersichtlicher. So kann nämlich jedes Feld selbst bestimmen, was es tut, wenn es geklickt wird, inklusive Bildwechsel, clearRect(), repaint() usw. Wenn das nämlich noch von einem zentralen Objekt gesammelt werden soll, gibts duetlich mehr code. Das Prinzip ist aber auch von der Aufgabe her so vorgesehen, dass wir mehrere Elemente adden sollen.

Was mich aber vielmher interessiert: schafft das gute AWT es nicht, so ca. 500 kleine Canvas mit jeweils nur einer wirklich kleinen Paint.methode und kleinen Bildern darzustellen? Das ist doch nicht so schwer, oder?
 
Hier ist der paint()-Teil in den Canvas-Objekten:

Code:
      Image bild = getToolkit.getImage("b1.gif");
      boolean printNeighbours = false, isMarked = false, finished = false;
      int beighbours = 0;
	public void paint(Graphics g) {
		g.clearRect(0, 0, 30, 30);
		g.drawImage(bild, 0, 0, 30, 30, this);
		if(printNeighbours && neighbours > 0) {
			g.setFont(new Font("Dialog.plain", Font.BOLD, 18));
			g.setColor(new Color(255, 230, 17));
			g.drawString(""+neighbours, 15, 15);
		}
		if(isCovered() && isMarked) {
			if(finish) {
				g.setFont(new Font("Dialog.plain", Font.BOLD, 22));
				g.setColor(new Color(255, 230, 17));
				g.drawString("?", 15, 20);
			}
			else {
				g.setFont(new Font("Dialog.plain", Font.BOLD, 22));
				g.setColor(new Color(255, 29, 17));
				g.drawString("?", 15, 20);
			}
		}
	}

Sieht nach mehr aus, als es ist. Es wird immer zuerst die Fläche gelöscht, dann genau ein Bild gezeichnet und dann maximal ein Zeichen über das Bbild gegeben. Die gif-Images sind im Bereich von wenigen KB.

[edit] Die Variablen da oben sind natürlich nicht immer in dem Zustand, aber ich hab das mal beispielhaft dazugeschrieben, damit man weiß, was die einzelnen Bezeichner darstellen. [/edit]
 
R

Roar

Gast
versuch mal bilder/fonts und colors zentral zu speichern.
ansonsten würd ich das gern mal selbst ausprobiern :?
 
Roar hat gesagt.:
versuch mal bilder/fonts und colors zentral zu speichern.
ansonsten würd ich das gern mal selbst ausprobiern :?

In der Javadoc zu .getImage() steht, dass bei dieser Methode intern bei zwei gleichen Bildern auch das selbe Bild benutzt wird. Im Gegensatz zu .createImage(), wo für zwei Gleiche Bildern intern zwei verschiedene Speicherstellen benutzt werden. Sah man auch am Speicherplatz, mit create warens 80MB Laufzeitspeicherbedarfdingends, mit get "nur" noch 20MB. Wenn du willst, kann ich dir das Prog zuschicken, sobald es fertig ist, also so Dienstag abend oder Mittwoch Nachmittag. DAnn kannst du dir das mal mit eigenen Augen ansehen :).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B viele JPanels auf JLayeredPane -> to SVG? AWT, Swing, JavaFX & SWT 15
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
A JavaFX Sehr viele Exceptions bei Taschenrechner mit JavaFx AWT, Swing, JavaFX & SWT 2
M If für viele TextFields AWT, Swing, JavaFX & SWT 7
kaoZ Swing JMenuBar, Preferences, Properties... und viele andere lustige Dinge (Best Practice) AWT, Swing, JavaFX & SWT 15
K Viele Textfield mit Hilfe eines MousListener leeren - möglich? AWT, Swing, JavaFX & SWT 8
M Swing Erste Schritte mit der GUI, viele Probleme AWT, Swing, JavaFX & SWT 36
propra 2D-Grafik Beliebig viele Objekte auf einer Zeichenfläche zeichnen AWT, Swing, JavaFX & SWT 15
L unbestimmt viele JComboBox und ItemListener dazu erstellen AWT, Swing, JavaFX & SWT 2
P 2D-Grafik Viele Bilder zu einem Video AWT, Swing, JavaFX & SWT 3
Dit_ Wenn viele NebenFenster zum Locationsetzen das HauptFenster brauchen AWT, Swing, JavaFX & SWT 2
P SWT Composite und viele Labels AWT, Swing, JavaFX & SWT 10
D Zu viele repaints() AWT, Swing, JavaFX & SWT 17
R JTable für sehr viele Daten sehr langsam AWT, Swing, JavaFX & SWT 20
G Viele Fehler beim zeichen AWT, Swing, JavaFX & SWT 5
Z zu viele prozesse AWT, Swing, JavaFX & SWT 2
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
D Wie viele Pixel welches Icon? AWT, Swing, JavaFX & SWT 4
TheJavaKid Lösung für zu Viele JMenuItems. AWT, Swing, JavaFX & SWT 4
Starchild Beliebig viele Knöpfe AWT, Swing, JavaFX & SWT 5
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
W Canvas oder Polygone? AWT, Swing, JavaFX & SWT 3
Monokuma Canvas Form entfernen AWT, Swing, JavaFX & SWT 2
Monokuma KeyEvent in der Canvas Klasse AWT, Swing, JavaFX & SWT 0
M Internal Frames und Canvas-Element AWT, Swing, JavaFX & SWT 9
TheJavaKid Auf eine Zeichnung im Canvas reagieren AWT, Swing, JavaFX & SWT 13
M Halbkreiszeichnen(Canvas) - Diesen mit Mouseevents bestücken AWT, Swing, JavaFX & SWT 3
dereki2000 AWT Canvas zeichnet nicht AWT, Swing, JavaFX & SWT 7
D Canvas oder scene graph? AWT, Swing, JavaFX & SWT 16
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
Prafy AWT Klickbare Bereiche auf Canvas AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX Canvas einfaches Zeichenprogramm AWT, Swing, JavaFX & SWT 7
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
L JavaFX Canvas max size? AWT, Swing, JavaFX & SWT 1
J JavaFX Rendering von Canvas sehr langsam AWT, Swing, JavaFX & SWT 2
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
Regedit JavaFX Java Canvas hört ständig auf zu aktualisieren/malen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
B JavaFX KeyEvent und Canvas draw Problem AWT, Swing, JavaFX & SWT 9
K Fragen zu JavaFx Canvas AWT, Swing, JavaFX & SWT 0
C Java FX Canvas missing getGraphicContext2D AWT, Swing, JavaFX & SWT 5
windl Overlay mit Transparentem JWindow und Canvas AWT, Swing, JavaFX & SWT 2
S JavaFX Canvas - nur eine Figur auf der Zeichenfläche färben? AWT, Swing, JavaFX & SWT 1
R JComponent auf Canvas AWT, Swing, JavaFX & SWT 8
S Canvas durch transparentes JPanel sichtbar machen AWT, Swing, JavaFX & SWT 2
A JavaFX Menubar wird von Canvas überzeichnet AWT, Swing, JavaFX & SWT 8
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
Luk10 KeyBindings mit Canvas? AWT, Swing, JavaFX & SWT 3
B LookAndFeel GWT: Canvas in TabSet nicht sichtbar AWT, Swing, JavaFX & SWT 2
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
T Canvas clipping AWT, Swing, JavaFX & SWT 4
S 2 Canvas übereinander AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Canvas Problem(Größe) AWT, Swing, JavaFX & SWT 6
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
M Wofür Canvas? AWT, Swing, JavaFX & SWT 5
frankred Swing Canvas nach "Window-resize" neu Zeichnen lassen wegen Anzeigefehler AWT, Swing, JavaFX & SWT 4
S Canvas in ScrollPane wird beim scrollen immer neu gezeichnet AWT, Swing, JavaFX & SWT 3
F Nur ein Objekt auf Canvas neu zeichnen AWT, Swing, JavaFX & SWT 4
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
lumo SWT Canvas transparent AWT, Swing, JavaFX & SWT 4
2 AWT Zeichnen in Canvas AWT, Swing, JavaFX & SWT 5
B 2D-Grafik Malen/übermalen mit Canvas AWT, Swing, JavaFX & SWT 5
L Dynamisch Objekte in Canvas zeichnen AWT, Swing, JavaFX & SWT 5
G Auf Canvas zeichnen nur über boolean-Abfragen? AWT, Swing, JavaFX & SWT 5
S Canvas-Inhalt in Laufzeit ändern AWT, Swing, JavaFX & SWT 6
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
S Bild wird auf Canvas in Applet nicht gezeichnet AWT, Swing, JavaFX & SWT 4
G SWT Linie unter transparentes Canvas zeichnen AWT, Swing, JavaFX & SWT 4
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
S SWT Canvas: Flackernde Bilder AWT, Swing, JavaFX & SWT 3
T AWT canvas AWT, Swing, JavaFX & SWT 3
P Canvas: String wird nicht gezeichnet AWT, Swing, JavaFX & SWT 5
T SWT Canvas Koordinaten per MouseMove auslesen AWT, Swing, JavaFX & SWT 1
H Zeichnen auf smartgwt Canvas AWT, Swing, JavaFX & SWT 4
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
K Swing Sinuskurve zeichnen auf Canvas AWT, Swing, JavaFX & SWT 2
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
D Canvas soll angezeigtes jpg-Bild aktualisieren AWT, Swing, JavaFX & SWT 4
N zeichnen auf awt canvas AWT, Swing, JavaFX & SWT 9
G Ein Wort in einem String färben in einer Canvas AWT, Swing, JavaFX & SWT 10
J Canvas Inhalt als Bild speichern! AWT, Swing, JavaFX & SWT 16
T zeichnen mit canvas AWT, Swing, JavaFX & SWT 3
S repaint im Canvas AWT, Swing, JavaFX & SWT 3
D Canvas und Buttons AWT, Swing, JavaFX & SWT 20
P Zeichnen in Canvas und Neuzeichnen AWT, Swing, JavaFX & SWT 3
G Canvas + Swing-Objekte AWT, Swing, JavaFX & SWT 5
C canvas.draw zeichne ohne ausfüllen AWT, Swing, JavaFX & SWT 9
P Canvas in JFrame mit GridLayout AWT, Swing, JavaFX & SWT 4
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben