Eigenes JComponent wird nicht gezeichnet :-(



  • Ich soll ein kleines Spiel entwickeln bei dem auf dem Fenster zufällig Rechtecke erscheinen die der User dann schnellstmöglich anklicken soll. Alles kein Problem, auch anklicken kann man die Rechtecke - bloß die Position kann man nur erraten, da sie nicht gezeichnet werden.

    Ich habe ein JPanel namens "drawPanel" auf dem die Rechtecke liegen. Ein Rechteck ist eine kleine Klasse die die Position sowie die Erscheinungszeit des Rechtecks speichert.

    class Rectangle extends JComponent
    {
        // ...
    
        public void paint (Graphics g)
        {
             super.paint(g);
             g.drawRect(m_x,m_y,m_width,m_height);
             g.fillRect(m_x,m_y,m_width,m_height);
    
             System.out.println("PAINT RECT"); // Wird ausgegeben, also wird die Funktion aufgerufen
        }
    }
    

    Wenn ein Rechteck getroffen wurde lösche ich es und füge ein neues hinzu:

    Rectangle rect = (Rectangle)iter.next();
    if(rect.pointInRect(ev.getX(),ev.getY()))
    {
    	m_main.getDrawPanel().remove(rect); // Derzeitiges Rechteck aus dem Panel entfernen
    
          m_stats.hitRect(rect.getDiffTime(m_stats.getCurrentTime())); // Stats updaten (um später die durchschnittliche trefferzeit berechnen zu können)
    	iter.remove(); // rechteck aus der liste der rechtecke entfernen
    
    	Rectangle newRect = getNewRectangle(); // neues rechteck anlegen (mit richtiger größe)
    	m_rects.add(newRect); // der liste der rechtecke hinzufügen
    	m_main.getDrawPanel().add(newRect); // dem panel hinzufügen, damit das rechteck auch gezeichnet wird
    	m_main.getDrawPanel().repaint(); // panel neu zeichnen (kA ob das benötigt wird, hab ich mal eingefügt als nichts angezeigt wurde)
    
    	return;
    }
    

    Wenn ich nun ein Rechteck treffe wird korrekt wieder die paint()-Methode des neue Rechtecks aufgerufen (da derzeit immer nur 1 Rechteck in der Liste ist zu Testzwecken). Aber ich sehe kein Rechteck 😞

    Was mache ich falsch?

    MfG SideWinder



  • Vordergrundfarbe = Hintergrundfarbe?
    LayoutManager benutzt?



  • Farbe habe ich ausgeschlossen.
    Nein, LayoutManager hat das Panel keinen - muss es denn einen haben um frei darauf zeichnen zu können?

    MfG SideWinder



  • Wenn die Parent-Component einen LayoutManager hat, der dein Panel auf die Grösse 0/0 setzt, sieht man nichts. Lass dir mal die Grösse deines Panels ausgeben (System.out.println( getSize() )).



  • public JPanel getMainPanel ()
    	{
    		if(m_mainPanel == null)
    		{
    			m_mainPanel = new JPanel();
    			m_mainPanel.setLayout(new BorderLayout());
    
    			m_mainPanel.add(getDrawPanel(),BorderLayout.CENTER);
    			m_mainPanel.add(getBottomPanel(),BorderLayout.SOUTH);
    		}
    
    		return m_mainPanel;
    	}	
    	public JPanel getDrawPanel ()
    	{
    		if(m_drawPanel == null)
    		{
    			m_drawPanel = new JPanel();
    			m_drawPanel.setLayout(null);
    			m_drawPanel.setPreferredSize(new Dimension(getMainPanel().getWidth(),getMainPanel().getHeight()-50));
    		}
    
    		return m_drawPanel;
    	}
    

    Die Größe ist nach setPreferredSize() auf ~700/500, die Rechtecke passen sicher hinein (liegen in keinem Punkt außerhalb des Panels).

    MfG SideWinder



  • Hmm, jetzt ruft er paint() auch nicht mehr auf 😕

    MfG SideWinder



  • Problem gefunden, ich zeichnete in paint() relativ zum Panel, muss aber relativ zu meiner Location zeichnen!

    MfG SideWinder



  • Kleiner tip:

    Leite von JPanel ab, und überschreibe paintCompomonent(...) das ist die beste lösung,ohne das du mit Layout/position etc rechnen musst. Klappt immer 😃

    - jens


Anmelden zum Antworten