Probleme mit Grafik (Java)

Hallo Zusammen!

Ich habe das Probem, dass ich nicht zwei Grafiken zu meinem Frame hinzufügen kann. Die beiden Grafiken sind zwei Klassen (Spielfigur und Sammleobjekt), die von JPanel erben. Diese füge ich zum JFrame hinzu; jedoch wird nur das Sammelobjekt angezeigt und nicht die Spielfigur. Füge ich allerdings erst das Sammelobjekt und dann die Spielfigur hinzu, wird die Spielfigur, aber nicht das Sammelobjekt angezeigt. Ich habe keine Ahnung, woran das liegen könnte.
Vielen Dank im Voraus!

Hier mein Quellcode:

Klasse Oberflaeche:
Java:
import javax.swing.*;
import java.awt.event.*;
import java.awt.Color;
public class Oberflaeche {
  JFrame frame; 
  Spielfigur spielfigur = new Spielfigur();
  Sammelobjekt sammelobjekt = new Sammelobjekt();
  public void los() {  
   
    //Spieloberfläche Init
    frame = new JFrame("The Adventures of Snackman");
    frame.setSize(500, 500);
    frame.setVisible(true);    
    frame.setLocationRelativeTo(null);      
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
    frame.add(spielfigur);
    frame.add(sammelobjekt);   
      
  }
 
  public static void main(String[] args) {
    Oberflaeche meineUI = new Oberflaeche();
    meineUI.los(); 
  }         
}

Klasse Spielfigur:
Java:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.BorderLayout;
public class Spielfigur extends JPanel {  
  int x  = 100;  
  int y = 100;
  Color farbeFigur = Color.blue; 
 
  int vx = 0;
  int vy = 0; 
 
  public void paintComponent (Graphics g){
    super.paintComponent(g);
    g.setColor(farbeFigur);
    g.fillOval (x - 30, y- 30, 2 * 30, 2 * 30);      
  }        
}

Klasse Sammelobjekt:
Java:
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.BorderLayout;
public class Sammelobjekt extends JPanel{
  Color farbeO = Color.red;
  int oX = 200;
  int oY = 200;
  int radius = 5;    
 
  public void paintComponent (Graphics g){
    super.paintComponent(g);
    g.setColor(farbeO);
    g.fillOval (oX - radius, oY- radius, 2 * radius, 2 * radius);         
  }
}
 
Ich nehme einfach mal an das beide Panels einfach übereinander liegen. Je nachdem welches als letztes hinzugefügt wird, dieses wird angezeigt.

Schon probiert die Größe und Position eines Panels zu ändern?
 
Leider nicht. Ich habe die Koordinaten geändert und es wird wieder nur das JPanel angezeigt, welches ich als letzes zum Frame hinzugefügt habe. Außerdem kann das kleine "Sammelobjekt" die Spielfigur nicht überdecken. 😉
 
Warum willst du pro Objekt in ein eigenes JPanel malen? Du willst doch das Objekte auf der selben Fläche sind. Mach dir ein Interface Drawable, das deine Klassen implementieren und lass die dann in der paintComponent aufrufen mit dem Graphics-Objekt.
 
@PeterDerProgrammierer Das liegt am Standardlayout des JFrame. Das BorderLayout. Wenn man da keine "Positionen" beim adden mitgiebt, wird die Komponente in CENTER gelegt. Es passt aber immer nur eine Komponente rein. Wird eine zweite an die selbe Position gelegt, ersetzt das die erste.

Code:
frame.add(meinPanel); //ist das selbe wie:
frame.add(meinPanel, BorderLayout.CENTER);
natürlich nur wenn auch ein BorderLayout verwendet wird, was wie gesagt beim JFrame Standard ist.


Ansonsten stimme ich mit @Flown überein. Pro darzustellenden Objekt ein JPanel zu haben scheint mir nicht so ideal zu sein. Die sollen ja sicherlich überlappend (gleichzeitig) auf der selben Fläche dargestellt werden, oder nicht?
 
@X5-599 Ich möchte ein JPanel für die Spielfigur und ein JPanel für das Sammelobjekt erstellen (wenn das so sinnvoll ist). Das soll später ein Spiel werden, bei dem es das Ziel ist, das Sammelobjekt über die Spielfigur einzusammeln.
Das Sammelobjekt wird hierbei später nach dem Zufallsprinzip auf dem Spielfeld (JFrame) positioniert.

Die beiden JPanels sollen dabei aber nicht auf der selben Fläche dargestellt werden (wenn ich das jetzt richtig verstanden habe).
 

Zurück
Oben