Swing Schwierigkeiten mit JComponent

  • Themenstarter Themenstarter skorpien94
  • Beginndatum Beginndatum
S

skorpien94

Gast
Guten Tag an alle,
ich möchte gerne zwei Objekte in ein JFrame einfügen.
Ich habe mir zuerst zwei JComponent klassen erstellt (ein Kreis und ein Rechteck).
Java:
public class rectangle extends JComponent{
  
    private int x, y, width, height;
  
    public rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
  
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillRect(x, y, width, height);
    }
}
Java:
public class ball extends JComponent{
  
    private int x, y, width, height;
  
    public ball(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
  
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillOval(x, y, width, height);
    }
  
}
Hier ist meine main class:
Java:
public class component{

    public static void main(String[] args) {
      
        JFrame frame = new JFrame("Pong");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 600);
        frame.setVisible(true);
      
        rectangle rect= new rectangle(10, 10, 50, 50);
        ball ball = new ball(50, 50, 20, 20);
      
        frame.add(rect);
        frame.add(ball);
      
    }
}
wenn ich nur ein Objekt auf das Jframe erstelle dann wird dieses auch angezeigt. Die Position und die Größe des Objekts kann ich mit den Parametern bearbeiten.
Aber wenn ich jetzt das zweite Objekt noch zusätzlich auf das JFrame hinzufüge, dann wird das erste Objekt gelöscht und nur das zweite angezeigt.

Ich habe bereits frame.validate ausprobiert. Leider mit keinem erfolg.
Außerdem habe ich probiert ein JPanel zu erzeugen dieses dann auf das JFrame hinzuzufügen und dann die Objekte auf das JPanel zu platzieren.
Auf das Panel wurden Objekte leider gar nicht angezeigt.

Ich freue mich um jede hilfreiche Antwort.
 
Bei den meisten Layoutmanagern ist es nicht möglich mehrere Komponenten übereinander zu legen. Genaus so ist es auch beim BorderLayout, das vom JFrame standardmäßig verwendet wird. Ich sehe folgende Möglichkeiten:
1. null-Layout verwenden: frame.setLayout(null) und bei den hinzugefügten Komponenten mit setBounds die Position setzen
2. Alle Figuren mit Graphics2D auf ein Panel zeichen. Für die geometrischen Figuren gibt es schon geeignete Klassen. Beispielcode (nicht getestet):
Java:
class Canvas extends JPanel {

  private List<Shape> elements = new ArrayList<>();

  public Canvas() {
    setPreferredSize(new Dimension(400,400));
  }

  public void addShape(Shape shape) {
    elements.add(shape);
  }

  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D graphics = (Graphics2D)g;
    for (Shape shape : elements) {
      graphics.draw(shape);
    }
  }
}

Benutzen des Canvas:
Java:
Canvas canvas = new Canvas();
canvas.add(new Rectangle(10, 10, 50, 50));
canvas.add(new Ellipse2D.Double(50, 50, 20, 20));
 
Danke für Ihre Antwort.
Ich habe das eben gerade ausprobiert und das hat leider nicht geholfen.

Edit:
ok, jetzt kann ich schon mal mehr als nur ein Rechteck anzeigen lassen, aber mein Kreis wird nicht mehr angezeigt.
Ich habe das Layout auf null gesetzt und die Position mit setBounds() bestimmt
 
Zuletzt bearbeitet von einem Moderator:
Ich habs gerade mal getestet und es funktioniert. Du musst nur darauch achten an die richtige Position zu zeichnen. Die Methode paint bzw paintComponent zeichnet im Koordinatensystem der Komponente, nicht des Frames:
Java:
public class Rectangle extends JComponent {

   private int x, y, width, height;

   public Rectangle(int x, int y, int width, int height) {
     this.x = x;
     this.y = y;
     this.width = width;
     this.height = height;
     setBounds(x, y, width, height);
   }

   public void paint(Graphics g) {
     g.setColor(Color.BLACK);
     g.fillRect(0, 0, width, height);
   }
}

public class Ball extends JComponent {

   private int x, y, width, height;

   public Ball(int x, int y, int width, int height) {
     this.x = x;
     this.y = y;
     this.width = width;
     this.height = height;
     setBounds(x, y, width, height);
   }

   public void paint(Graphics g) {
     g.setColor(Color.BLACK);
     g.fillOval(0, 0, width, height);
   }

}

public class Canvas {

   public static void main(String[] args) {
     JFrame frame = new JFrame("Pong");
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     frame.setSize(800, 600);
     frame.setVisible(true);

     Rectangle rect = new Rectangle(10, 10, 50, 50);
     Ball ball = new Ball(50, 50, 20, 20);

     frame.add(rect);
     frame.add(ball);

   }
}

Btw: Klassennamen sollten mit einem Großbuchstaben beginnen und es ist üblich die Methode paintComponent statt paint zu überschreiben.
 

Zurück
Oben