paintComponent wird nicht dargestellt

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo zusammen. Ohne lang um den heissen Brei herum zu reden komme ich direkt zu meinem Problem. Ich moechte ein Minispiel programmieren bei dem sich ein unbemannter Helikopter durch einen Garten steuern lassen kann. Der Garten ist mit Radarposten ausgestattet. Die Radarposten werden allerdings nicht angezeigt. Hier mal zur Ubersicht das Klassendiagramm:


Das ganze basiert auf einem MVC-Pattern, sodass ich spaeter einfach neue Views hinzufuegen kann, etwa um die aktuelle Geschwindigkeit des Helikopters anzuzeigen.

Nun, ich hab keine Ahnung warum die Radarposten nicht gezeichnet werden. 🙁

hier mal der Source:

Code:
import javax.swing.JPanel;
import java.awt.BorderLayout;

public class Mainpanel extends JPanel
{
    public Mainpanel()
    {
        setLayout(new BorderLayout());
        GardenPanel gp = new GardenPanel(400, 300, 7);
        GardenModel gm = new GardenModel(gp);
        add(gp, BorderLayout.CENTER);
        add(new ControllPanel(), BorderLayout.SOUTH);
                
    }
}

Code:
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Observable;

public class GardenModel extends Observable
{
    private ArrayList<Radarstation> radarList;
    private int dx, dy;
    private Dimension gardenSize;
    
    public GardenModel(GardenPanel gp)
    {
        this.gardenSize = gp.getSize();
    }        
}

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.util.ArrayList;
import javax.swing.JPanel;

public class GardenPanel extends JPanel
{
    private int x, y, aantalRadaren;
    private ArrayList<Radarstation> radarList;
    private Dimension gardenSize;
    
    public GardenPanel(int x, int y, int aantalRadaren)
    {
        gardenSize = new Dimension(x, y);
        this.aantalRadaren = aantalRadaren;
        
        radarList = new ArrayList<Radarstation>();
        
        setSize(x, y);
        setVisible(true);        
        setBackground(Color.GREEN);
        System.out.println("reached GardenPanel Constructor");
        generateRadaren();
    }
    
    public void generateRadaren()
    {
        System.out.println("reached generateRadaren");
        Dimension d = new Dimension();
        Point p = new Point();            
        int x = (75 + ((int) Math.random() * 75));
        int y = (75 + ((int) Math.random() * 75));            

        d.setSize(x, y);
        
        if(radarList.isEmpty())
        {                        
            x = (int) (Math.random() * gardenSize.getWidth()); 
            y = (int) (Math.random() * gardenSize.getHeight());                        
            p.setLocation(x, y);                        
            
            radarList.add(new Radarstation(p, d, Color.BLUE));
        }
        
        else if(!radarList.isEmpty());
        {
            for(int i = 0; i < aantalRadaren; i++)
            {
                Radarstation rs = radarList.get(i);
                
                x = (int) (rs.getPosition().getX() +  (Math.random() * 200));
                y = (int) (rs.getPosition().getY() + (Math.random() * 100) - 50);                                
                p.setLocation(x, y);
                
                x = (75 + ((int) Math.random() * 75));
                y = (75 + ((int) Math.random() * 75));            
                d.setSize(x, y);
                
                Radarstation rsNew = new Radarstation(p, d, Color.BLUE);
                radarList.add(rsNew);
                System.out.println("Radar" + (i + 2) + "geadded");
            }
        }
    }
    
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        for(Radarstation r: radarList)
        {
            r.paint(g);
        }
    }
    
    public Dimension getSize()
    {
        return new Dimension(x, y);
    }
}

Code:
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Color;
import java.awt.Graphics;

public class Radarstation
{
    private Point position;
    private Dimension size;
    private Color color;
    
    public Radarstation(Point pos, Dimension size, Color color)    
    {
        this.position = pos;
        this.size = size;
        this.color = color;
    }
    
    public Dimension getSize()
    {
        return size;
    }
    
    public Point getPosition()
    {
        return position;
    }
    
    public void setPosition(Point p)
    {
        position = p;
    }
    
    public void paint(Graphics g)
    {
        g.setColor(color);            
        System.out.println("posX: " + (int) position.getX() + "  posY: "+ (int) position.getY() +  "  scaleX: " + 
              (int) size.getWidth() + "  scaleY: " + (int) size.getHeight());

        g.fillOval((int) position.getX(), (int) position.getY(), (int) size.getWidth(), (int) size.getHeight());
        
    }
    
    public void setSize(Dimension d)
    {
        size = d;
    }
}
 
1. In GardenPanel.generateRadaren() nutzt Du immer die gleichen Point und Dimension Objekte, d.h. du schiebst alle deine Radarstationen immer weiter nach rechts und unten. Jede Radarstation soll einen eigenen Punkt und eine eigene Dimension bekommen.

2. Zeile 34 & 35
Code:
int x = (75 + ((int) Math.random() * 75));
Ergibt immer 75, da der Teil hinter dem + fast immer 0 ist.

3. Zeile 48 Böse Falle :
Code:
else if(!radarList.isEmpty());
Da ist ein Semikolon hinter dem if, soll bestimmt nicht so sein. Dadurch wird der Block dahinter immer ausgeführt.

4. Ich würde Radarstation von JComponent erben lassen, dann verwaltet JComponent die Koordinaten, Größe und Farbe für Dich. Du musst dann nur paintComponent() überschreiben und im GardenPanel für jede Radarstation einmal add(radarStation) aufrufen.
 
Danke Leute, ich werds machen! 😀
Das mit der Positionsberechnung war n echt dummer Fehler, genauso die Semikolongeschichte. Aber ich versteh das Resultat des ganzen nicht. Eigentlich sollte doch der Compiler einen Fehler auswerfen, da hinter einer Abfrage doch kein Komma stehen darf...
Ich fahr jetzt erstmal ins Wochenende und hoffe dann Dienstag das Projekt fertig gestellt zu haben. Danke für die Hilfe, keine Ahnung was gestern mit mir los war dass ich das mit dem Semikolon... :autsch:

beste Grüße,
Gast
 
Anonymous hat gesagt.:
Eigentlich sollte doch der Compiler einen Fehler auswerfen, da hinter einer Abfrage doch kein Komma stehen darf...
Ist ja kein Komma, sondern ein Semikolon und das ist erlaubt.
In einer vernünftigen IDE kann sich das aber als Warnung anzeigen lassen :wink:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben