JPanel wird zweimal hinterinander gezeichnet.. Wieso?

Zitrus

Bekanntes Mitglied
Zuerstmal der Code:

Klasse Beute:
Java:
import java.awt.geom.Rectangle2D;
import java.awt.Graphics;
import java.awt.Color;

public class Beute extends Rectangle2D.Double
{
    int width;
    int heigth;
    int x;
    int y;
    
    public Beute(int x, int y, int width,int heigth)
    {
        this.x = x;
        this.y = y;
        this.width = width;
        this.heigth = heigth;
    }
    
    public void paintComponent(Graphics g) {
        g.setColor(Color.GREEN);
        g.fillOval(x,y,width,heigth);
    }
}

Klasse Raeuber
Java:
import java.awt.geom.Rectangle2D;
import java.awt.Graphics;
import java.awt.Color;

public class Raeuber extends Rectangle2D.Double
{
    int width;
    int heigth;
    int x;
    int y;
    
    public Raeuber(int x, int y, int width,int heigth)
    {
        this.x = x;
        this.y = y;
        this.width = width;
        this.heigth = heigth;
    }
    
    public void paintComponent(Graphics g) {
        g.setColor(Color.BLUE);
        g.fillOval(x,y,width,heigth);
    }
}

Klasse Tile:
Java:
import java.awt.geom.Rectangle2D;
import java.awt.Graphics;
import java.util.Random;

public class Tile extends Rectangle2D.Double
{
    int x;
    int y;
    int width;
    int heigth;
    
    boolean test = false;

    public Tile(int x, int y, int width, int heigth)
    {
        this.x = x;
        this.y = y;
        this.width = width;
        this.heigth = heigth;     
    }

    public void paintComponent(Graphics g) {
        g.drawRect(x,y,width,heigth);
    }

    void addShapes(Rectangle2D.Double shape, Graphics g) {
        if(shape instanceof Beute) {
            Beute beute = (Beute)shape;
            beute.paintComponent(g);
            test = true;
        }
        else if(shape instanceof Raeuber) {
            Raeuber raeuber = (Raeuber)shape;
            raeuber.paintComponent(g);
            test = true;
        }
    }
    
    boolean checkShapes() {
        return test;
    }
}

Klasse Map:
Java:
import java.util.Random;
import java.awt.Graphics;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

public class Map
{
    Tile[][] tiles;
    Random r;

    public Map() {
        tiles = new Tile[6][6];
        r = new Random();
    }

    void drawRandom(Graphics g) {
        for(int i = 0; i < 6; i++) {
            for(int j = 0; j < 6; j++) {    
                int zufall = r.nextInt(3);
                if(zufall == 0){
                    tiles[i][j].addShapes(new Beute((100*j) + 25,(100*i) + 25,50,50), g);
                }
                else if(zufall == 1) {
                    tiles[i][j].addShapes(new Raeuber((100*j) + 25,(100*i) + 25,50,50), g);
                }
                else {
                }
            }
        }
    }

    void draw(Graphics g) {
        for(int i = 0; i < 6; i++) {
            for(int j = 0; j < 6; j++) {
                tiles[i][j] = new Tile(100 * j, 100 * i, 100, 100);
                tiles[i][j].paintComponent(g);     
            }
        }
    }
}

Klasse Fenster:
Java:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;

public class Fenster extends JFrame
{
    Map map;
    
    public Fenster(Map m)
    {
        super("Biologie-Game");
        
        this.map = m;
        
        setSize(600,628);
        setResizable(false);
        
        MyPanel panel = new MyPanel();
        
        add(panel);
        setVisible(true);
    }
    
    class MyPanel extends JPanel {
        public MyPanel() {
            setSize(600,600);
        }
        
        public void paint(Graphics g) {
            super.paintComponent(g);
            
            map.draw(g);
            map.drawRandom(g);
        }
    }
}

Beim Erzeugen eines neuen Fensters werden die Tiles ausgegeben(auch mit den Kreisen). Nach ca. einer Millisekunde verändern sich die Positionen der Kreise(das Panel zeichnet sich neu) und beim ausgeben von checkShapes() auf die Konsole kommen zwei Werte raus.
Sieht dann ungefährt so aus:

Bei folgendem Methodenaufruf: tiles[0][3].checkShapes();

Fenster "ploppt" auf --> Konsole zeigt true an
Danach verändert sich der Inhalt des Panels z.B Kreise waren an den Position [0][6],[0][3] und [5][4] und sind auf einmal an [1][3],[2][4] und [5][5] --> Konsole zeigt false.

Meine Frage ist nun wieso das Panel sofort wieder neu gezeichnet wird und wie ich den Fehler ausmerzen kann.

Mfg, Zitrus
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Du hast eine große Menge an wiederholtem Code. Dafür gibt es Vererbung.
Du hast paint überschrieben. In Swing sollte es paintComponent sein.

Warum es nun zwei mal aufgerufen wird, weiß ich grade nicht aber das Problem liegt darin, dass du paintRandom hast. Darin wird jedes Mal eine neue Zufallswelt generiert. Du solltest eher initRandomWorld haben, was ein mal aufgerufen wird, mehrere Parameter initialisiert und auf diese Parameter greift die noch zu implementierende Methode paintWorld zu.
 

Zitrus

Bekanntes Mitglied
Aber ich muss doch erst die Methode draw() und dann die Methode drawRandom() ausführen, da ich sonst ja eine NullPointerException kriege, weil keine Tiles vorhanden sind denen man eine Grafik hinzufügen könnte. Oder habe ich deine Antwort falsch verstanden?

PS: Hatte zu Beginn auch die paintComponent Methode im Panel. Hat auch nicht geklappt.
PS'S: Wo wiederhole ich denn Code? (Mal Abgesehen von der Beute und Raeuber Klasse)
 
Zuletzt bearbeitet:

Zitrus

Bekanntes Mitglied
Hi nochmal,

Habe jetztmal testhalber die Methode draw() mit einem System.out.println() bestückt.
Java:
 void draw(Graphics g) {
        for(int i = 0; i < 2; i++) {
            for(int j = 0; j < 2; j++) {
                tiles[i][j] = new Tile(100 * j, 100 * i, 100, 100);
                tiles[i][j].paintComponent(g);  
                
                System.out.println("Tile" + "[" + i + "]" + "[" + j + "]" + tiles[i][j].x );

Ich erhalte beim erzeugen eines neuen Fensters folgende Ausgabe:

Tile[0][0]0
Tile[0][1]100
Tile[1][0]0
Tile[1][1]100
Tile[0][0]0
Tile[0][1]100
Tile[1][0]0
Tile[1][1]100

Ich verstehe immer noch nicht wieso es doppelt ausgegeben wird.
@Gucky könntest du mir vielleicht nochmal erklären was ich verändern soll? Es tut mir wirklich leid aber habe deine Antwort leider nicht so ganz verstanden.
 

Gucky

Top Contributor
Es gibt eine Methode namens repaint(). Diese wird immer aufgerufen, wenn irgendetwas am Container verändert wird. So z.B. die Größe.
Ich könnte mir vorstellen, dass es an setSize liegt. Du könntest mal vor und nach setSize eine Ausgabe machen, um das herauszufinden.

initRandomWorld würde auch nichts zeichnen sondern bspw. im Konstruktor von Map aufgerufen werden und nur die Positionen der Tiles definieren.

Trotzdem solltest du paintComponent überschreiben. Und vergiss nicht die preferredSize zu setzen.

Genau dort widerholst du Code ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JPanel wird nicht angezeigt Java Basics - Anfänger-Themen 1
S JPanel wird versetzt auf JFrame gelegt Java Basics - Anfänger-Themen 2
S JPanel wird nicht eingefügt Java Basics - Anfänger-Themen 3
Antoras BoxLayout wird auf JPanel nicht erstellt Java Basics - Anfänger-Themen 4
G Image/-Icon wird nicht auf JPanel angezeigt Java Basics - Anfänger-Themen 4
G JPanel wird nicht angezeigt Java Basics - Anfänger-Themen 3
D JPanel repaint() wird nicht gemacht! Java Basics - Anfänger-Themen 7
richis-fragen Optisch JPanel BorderLayout vertikaler Rand dicker als horizontaler Rand Java Basics - Anfänger-Themen 4
N Klassen Hintergrundfarbe in JPanel ändert sich nicht Java Basics - Anfänger-Themen 3
J JSON mit einem JPanel Java Basics - Anfänger-Themen 3
J Ein mit UI-Designer erstelltes JPanel einblenden Java Basics - Anfänger-Themen 0
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
J Beim Start des Programms zB. eine Linie in JPanel ausgeben Java Basics - Anfänger-Themen 4
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
B Scrollbares Fenster (JScrollPane) mit JPanel scrollt nicht Java Basics - Anfänger-Themen 3
Zeppi JPanel responsive Grid Java Basics - Anfänger-Themen 0
J JPanel in JScrollPanel Java Basics - Anfänger-Themen 4
Elyt JPanel als HintergrundBild Java Basics - Anfänger-Themen 7
W 2 JPanel in einem JFrame Java Basics - Anfänger-Themen 4
B Wie kann man an ein JPanel eine Scrollbar anheften? Java Basics - Anfänger-Themen 8
O Swing JPanel Java Basics - Anfänger-Themen 4
CptK Klassen JPanel nach Ablauf der Spielzeit neuladen Java Basics - Anfänger-Themen 2
D Animation JPanel Java Basics - Anfänger-Themen 1
M JLabels "verrutschen" beim übergeben von JPanel Java Basics - Anfänger-Themen 2
D Auf angeklicktes JPanel zugreifen Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
D JPanel passt die Größe nicht an Java Basics - Anfänger-Themen 22
Y Webinhalt JPanel Java Basics - Anfänger-Themen 6
D Erste Schritte JPanel verschiebt Fenster via setVisible Java Basics - Anfänger-Themen 5
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
S JPanel variablenabhängig erstellen Java Basics - Anfänger-Themen 13
J Methoden Dinge auf einem JPanel paltzieren Java Basics - Anfänger-Themen 1
F JFrame resize verschiebt JPanel Java Basics - Anfänger-Themen 3
A altes JPanel entfernen und neues öffnen Java Basics - Anfänger-Themen 5
I A0-Format in jpanel anzeigen Java Basics - Anfänger-Themen 1
R NullPointerException wegen JPanel oder doch nicht ? Java Basics - Anfänger-Themen 7
J Probleme mit eigenem JPanel (IDE Eclipse) Java Basics - Anfänger-Themen 4
V jab ich eclipse verrückt gemacht :D ? array Jpanel, Jlabel Grafik Fehler / Frage Java Basics - Anfänger-Themen 5
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
I Problem mit JPanel Java Basics - Anfänger-Themen 0
B JPanel ändert die Hintergrundfarbe nicht Java Basics - Anfänger-Themen 2
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
C JPanel in MessageDialog Java Basics - Anfänger-Themen 1
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
S Inhalt von JPanel erst nach Resize sichtbar Java Basics - Anfänger-Themen 2
M Listener einerm JPanel hinzufuegen Java Basics - Anfänger-Themen 3
gamebreiti Methoden JPanel nach clearAll() und add neu zeichnen Java Basics - Anfänger-Themen 1
S vom JPanel aus durch Mouselistener Internet aufrufen Java Basics - Anfänger-Themen 6
Z JPanel bleibt leer Java Basics - Anfänger-Themen 2
E Bild per Verzeichnis/JFileChooser auf JPanel laden Java Basics - Anfänger-Themen 13
Q JPanel Java Basics - Anfänger-Themen 2
K Erste Schritte jpanel in einer klasse auslagern Java Basics - Anfänger-Themen 3
I Anfängerfrage JPanel repaint() Java Basics - Anfänger-Themen 6
N String auf JPanel bewegen Java Basics - Anfänger-Themen 6
K Erste Schritte Jframe Im Jpanel Java Basics - Anfänger-Themen 4
S Layout mit JPanel in JScrollPanel funktioniert nicht Java Basics - Anfänger-Themen 3
S JPanel drucken -> PrinterException Java Basics - Anfänger-Themen 2
B JPanel -JTable Java Basics - Anfänger-Themen 2
H JPanel Hintergrund transparent setzen? Java Basics - Anfänger-Themen 10
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
L zoomen aus jpanel Java Basics - Anfänger-Themen 7
P Bekomme in meinen JPanel nur eine JComponente angezeigt Java Basics - Anfänger-Themen 7
A Methoden repaint() zeichnet JPanel falsch Java Basics - Anfänger-Themen 3
R JFrame über einen JPanel Java Basics - Anfänger-Themen 5
I Veränderungen am JPanel vom JDialog aus Java Basics - Anfänger-Themen 6
F JPanel zu klein Java Basics - Anfänger-Themen 5
D GUI - Objekte in JPanel nach oben schieben Java Basics - Anfänger-Themen 2
P Netbeans Platform - JLabel und JPanel setLocation Problem Java Basics - Anfänger-Themen 2
Kenan89 JPanel mit JTable Java Basics - Anfänger-Themen 9
I JPanel in JPanel Java Basics - Anfänger-Themen 2
A Zugriff auf Komponente innerhalb einer JPanel Java Basics - Anfänger-Themen 8
J Auf einem JPanel ein JFrame platzieren Java Basics - Anfänger-Themen 10
S JPanel anzeige Java Basics - Anfänger-Themen 2
propra Wie mache ich einem JPanel mein bereits instanziertes Model bekannt Java Basics - Anfänger-Themen 9
T Zugreifen auf JPanel Java Basics - Anfänger-Themen 4
K JPanel auslagern Java Basics - Anfänger-Themen 9
J Paint Methode von JPanel aufrufen Java Basics - Anfänger-Themen 15
T Tastendruck simulieren in JPanel Java Basics - Anfänger-Themen 3
P JPanel in JTable einfügen Java Basics - Anfänger-Themen 23
E Erste Schritte Objekte werden in JPanel angedockt und maximiert Java Basics - Anfänger-Themen 7
M Componenten auf JPanel anzeigen Java Basics - Anfänger-Themen 2
F JPanel als JPG - weisse Fläche Java Basics - Anfänger-Themen 9
L Image laden und auf jPanel ausgeben Java Basics - Anfänger-Themen 7
M JLabel auf JPanel positionieren Java Basics - Anfänger-Themen 8
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
M MouseListener funkioniert auf JPanel nicht Java Basics - Anfänger-Themen 8
D JPanel + ein JLabel Java Basics - Anfänger-Themen 8
B JPanel-Oberfläche speichern Java Basics - Anfänger-Themen 9
X JTable in JPanel in JTabbedPane mouseevent von jtable kommt nicht durch Java Basics - Anfänger-Themen 3
P GUI, JPanel Java Basics - Anfänger-Themen 7
H JPanel in andere Klasse übergeben Java Basics - Anfänger-Themen 7
D Grösse eines JPanel hinsichtlich LayoutManager festlegen Java Basics - Anfänger-Themen 4
B JPanel über anderem JPanel Java Basics - Anfänger-Themen 6
F zeichnen in JPanel Java Basics - Anfänger-Themen 7
F Unterschied JPanel und JFrame Java Basics - Anfänger-Themen 5
U JPanel dynamisch gestalten Java Basics - Anfänger-Themen 7
H Zeichnen in JPanel Java Basics - Anfänger-Themen 8
K Auf JPanel Zeichnen Java Basics - Anfänger-Themen 8
C jPanel im jPanel verändern Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben