[Java] paint()-Problem u. Bsp. 4 Gewinnt

Kamikatze

Captain
Registriert
Okt. 2004
Beiträge
3.708
Hallo, nachdem niemand eine Lösung weiß, versuch ich mein Glück nun mal hier:

Ich bin zZ mit der Programmierung des Spiels 4 Gewinnt beschäftigt, nur hab ich einige Probleme:

Zuerst aber noch ein paar grundlegende Infos:
- Es ist netzwerkfähig (RMI), wird kein Server unter der angegebenen Adresse gefunden, wird automatisch einer auf localhost erzeugt. D.h. bei der ersten Instanz muss kein korrekter Wert für die RMI-Registry eingegeben werden. (Die übrigens aus dem Programm heraus erzeugt wird.)
- Der gesamte Netzwerk-Code befindet sich in der Klasse NetworkComponent.
- Es handelt sich um ein Netbeans 5.0-Projekt.
- Es ist noch nicht alles implementiert (wie z.B. Abbrechen-Buttons, 4-in-einer-Reihe-Kontrolle,...)

Probleme:
1.) Das Hauptproblem: Die ersten paar Mal funktioniert das automatische Zeichnen einfach nicht. Dieses Problem tritt nicht nur bei diesem Programm auf! Z.B. wird gleich nach beginn die paint()-Methode aufgerufen und trotzdem nicht gezeichnet - selbst wenn ich sie 5x aufrufen würde. Erst nachdem ich den zu zeichnenden Bereich verdeckt und wieder aufgedeckt hab, funktioniert alles.
Das Eigenartige ist, dass das nach dem Einwurf der ersten paar Spielsteine aufhört und problemlos funktioniert.

2.) Das Icon im Fenster soll immer die Farbe anzeigen, die gerade an der Reihe ist. Beim Umschalten gib ich auch eine entsprechende Meldung mit println(...) aus. Die Methode scheint ausgeführt zu werden, das Umschalten zeigt allerdings nur bei einem Fenster Wirkung.

3.) Das Programm funktioniert nicht über das Internet. Ist bei der Programmierung etwas zu beachten oder liegts an den OS-Sicherheitseinstellungen?

Weitere Fragen werden noch folgen! ;)
Aber schon mal thx!

PS: Ich hör mir auch sinnvolle Änderungsvorschläge gerne an!
 

Anhänge

Zuletzt bearbeitet:
Probleme:
Erst nachdem ich den zu zeichnenden Bereich verdeckt und wieder aufgedeckt hab, funktioniert alles.
[/QUOTE]

Musste man nicht noch sowas machen wie Fenster.updateUI oder so?
 
Es gibt 2 Methoden:
update(...) und repaint().
Beide rufen allerdings nur paint() auf - und beide bewirken nichts. :(

Vorher hatte ich auch schon eine Methode Zeichne() geschrieben, die ich immer aufgerufen habe und auch in paint() aufrief. Allerdings dasselbe Problem... es kam am Anfang einfach nichts.

Es machte aber einen Unterschied: wurde sie aufgerufen wurde das komplette Fenster neu gezeichnet.

Somit gleich zu meiner vorhin angesprochenen Frage (diese ist aber nur zweitrangig, weil sie nur meinen Wissensdurst löschen soll! ;) ):
Woher weiß die Methode paint() (die ja nur den überdeckten Bereich neu zeichnet), wie sie diesen Bereich neu zeichnen muss? Immerhin wird dies ja eigentlich in einer Schleife berechnet. Oder (wie ich vermute) wird der Fenster-Inhalt nur als Bitmap von Java gespeichert und betroffene Bereiche durch die gespeicherten wieder ersetzt? Kann mir nämlich nicht vorstellen, dass der Inhalt nur dieses Bereiches einfach so neu berechnet werden kann.

EDIT:
Ach ja... im zip-File ist im Unterordner dist auch gleich noch eine funktionierende, ausführbare jar-Datei zum Testen.
Zum Ausführen in der Konsole "java -jar VierGewinnt.jar" eingeben - nur so sind auch die zusätzlichen Infos, die durch println(...) ausgegeben werden sichtbar!
 
Zuletzt bearbeitet:
hey
ich würde nicht alles in eine Class schreiben das ist ja nicht schön zu lesen.

mein vorschlag benutz auch nen paar JPanels die kann man dann gut refreshen.

und so weit wie ich das glaube wird paint erst dann aufgerufen, wenn du einmal am Frame ziehst.

Aufruf in deiner bestehenden class
und in deiner init Mehtode
add(platform);
Code:
private CPlatform platform=new CPlatform();

public void paint(Graphics g) {
        super.paint(g);
        add(platform);
        platform.validate();
    }

Neue Class
Code:
package viergewinnt;

import java.awt.Graphics;
import java.awt.Image;
import java.util.Vector;

import javax.swing.JPanel;

public class CPlatform extends JPanel {
    Vector<Integer> steinposx = new Vector<Integer>();
    Vector<Integer> steinposy = new Vector<Integer>();
	final int STONESIZE = 78, FELDSIZEX = 796, FELDSIZEY = 588, ROWS = 6, COLUMNS = 7, YELLOW = -1, RED = 1;
    IntTable spielfeld = new IntTable(ROWS, COLUMNS);
	public CPlatform() {
	}
	
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		Image feld = this.getToolkit().getImage(this.getClass().getResource("Feld.png"));
        Image rot = getToolkit().getImage(this.getClass().getResource("Rot.png"));
        Image gelb = getToolkit().getImage(this.getClass().getResource("Gelb.png"));
        
        g.drawImage(feld,4,30,null);
        
        for (int i = 0; i <= ROWS-1; i++) {
            for (int j = 0; j <= COLUMNS-1; j++) {
                if (spielfeld.GetValue(i, j) == RED)
                    g.drawImage(rot,steinposx.elementAt(j),steinposy.elementAt(i),null);
                else if (spielfeld.GetValue(i, j) == YELLOW)
                    g.drawImage(gelb,steinposx.elementAt(j),steinposy.elementAt(i), null);
            }
        }
	}
}
 
Zuletzt bearbeitet:
Wie gesagt kann man den paint()-Inhalt aber auch auf eine andere Methode auslagern und die dann aufrufen und es wird trotzdem nicht gezeichnet! Allerdings nur die ersten paar Male. Mein Lehrer meint, dass das Problem erst seit Java 1.5 auftritt, er aber nirgends dazu etwas finden konnte. Vllt. liegt es also ja doch an einem Denkfehler, den noch niemand bemerkt hat...

PS: Schon mal Danke für die Antwort! :)
 
hey

*.validate(); ist dafür die beste wahl wenn du dein setResizable(false); weglasen würdest und am fester ziehst wirst du bemerken das alles dargestellt wird. Du kannst die ne refresh Methode Bauen die du aufrufst nach dem du dein Fenster auf setVisible(true) gesetzt hast
 

Ähnliche Themen

Antworten
4
Aufrufe
8.393
Zurück
Oben