Swing Schwierigkeiten mit JComponent

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.
 

Enceladus271

Bekanntes Mitglied
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));
 
S

skorpien94

Gast
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:

Enceladus271

Bekanntes Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Pfeilpolygon per Maus rotierbar machen - Kleine Schwierigkeiten AWT, Swing, JavaFX & SWT 29
M GEF und Eclipse Plugin schwierigkeiten AWT, Swing, JavaFX & SWT 2
G Anzeige schwierigkeiten AWT, Swing, JavaFX & SWT 3
Wildcard Layout Schwierigkeiten AWT, Swing, JavaFX & SWT 7
B Batik: Inhalt JComponent to SVG? AWT, Swing, JavaFX & SWT 6
Hatsi09 JComponent anklicken und "entklicken" AWT, Swing, JavaFX & SWT 7
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
T Swing JComponent vergrößern AWT, Swing, JavaFX & SWT 4
L JComponent und MouseMotionListener AWT, Swing, JavaFX & SWT 2
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
Z JComponent's requestFocus() - Wieso nicht immer anwendbar? AWT, Swing, JavaFX & SWT 1
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
W JComponent - ComponentListener - resized / moved AWT, Swing, JavaFX & SWT 5
Developer_X Wie heißt das JComponent hier? AWT, Swing, JavaFX & SWT 2
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
R JComponent auf Canvas AWT, Swing, JavaFX & SWT 8
A Abgeleitete JComponent wird nicht gezeichnet AWT, Swing, JavaFX & SWT 10
A JComponent Größe AWT, Swing, JavaFX & SWT 8
T jcomponent wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
N 2D-Grafik RTF in eigener JComponent AWT, Swing, JavaFX & SWT 2
D Swing JComponent zeichnen ohne sie zur Oberfläche hinzuzufügen AWT, Swing, JavaFX & SWT 2
P JComponent / JLabel drehen (Rotation) AWT, Swing, JavaFX & SWT 2
D JComponent erweitern AWT, Swing, JavaFX & SWT 4
1 JComponent -> java.lang.NullPointerException AWT, Swing, JavaFX & SWT 13
M 2x JComponent in einem JFrame darstellen? AWT, Swing, JavaFX & SWT 7
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
B Wechsel JTextArea und JComponent AWT, Swing, JavaFX & SWT 9
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
H JComponent == JTextfield? AWT, Swing, JavaFX & SWT 4
C Ermitteln ob JComponent einen Listener besitzt AWT, Swing, JavaFX & SWT 2
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
G JComponent nachträglich in JPanel einfügen AWT, Swing, JavaFX & SWT 5
M Ganzen Frame mit JComponent ausfüllen AWT, Swing, JavaFX & SWT 9
M JMenu teilweise unter einer JComponent AWT, Swing, JavaFX & SWT 4
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
T JComponent nur in Swing verwendbar? AWT, Swing, JavaFX & SWT 6
M Mehrere Icons in einer JComponent AWT, Swing, JavaFX & SWT 5
Dragonfire Image von JComponent AWT, Swing, JavaFX & SWT 2
T x und y herrausfinden eines JComponent auf JFrame AWT, Swing, JavaFX & SWT 14
J absolute Position einer JComponent ermitteln AWT, Swing, JavaFX & SWT 4
B "weiches" Bewegen von einem JComponent AWT, Swing, JavaFX & SWT 18
ARadauer JPanel vs JComponent AWT, Swing, JavaFX & SWT 2
I JDialog aus JComponent erstellen AWT, Swing, JavaFX & SWT 2
S JComponent u. JPanel ausdrucken AWT, Swing, JavaFX & SWT 3
J SWT JComponent Problem AWT, Swing, JavaFX & SWT 4
T JComponent überzeichnen? AWT, Swing, JavaFX & SWT 2
G JComponent in JTable AWT, Swing, JavaFX & SWT 8
M JComponent wird in JFrame nicht angezeigt AWT, Swing, JavaFX & SWT 4
D bei Thread in JComponent malen NullPointerException AWT, Swing, JavaFX & SWT 3
S Alle EventListener einer JComponent abfragen? AWT, Swing, JavaFX & SWT 3
S JComponent in JPanel darstellen AWT, Swing, JavaFX & SWT 2
N JComponent#getClientProperty(key) welche Schlüssel gibt es? AWT, Swing, JavaFX & SWT 3
E Drucken von JComponent. AWT, Swing, JavaFX & SWT 4
S JComponent ersetzen AWT, Swing, JavaFX & SWT 13
R Resize Problem bei JComponent AWT, Swing, JavaFX & SWT 2
M JButton in JComponent abfragen AWT, Swing, JavaFX & SWT 6
S Mausbehandlungen für JComponent AWT, Swing, JavaFX & SWT 7
M Verschiebbare JComponent AWT, Swing, JavaFX & SWT 5
C zeichnen auf jComponent AWT, Swing, JavaFX & SWT 3
S in einem JComponent zu zeichnen AWT, Swing, JavaFX & SWT 4
G Grafik auf JComponent ohne Überschreiben von Paint-Methoden AWT, Swing, JavaFX & SWT 4
R JComponent malt seine Kinder nicht AWT, Swing, JavaFX & SWT 8
G JComponent Hintergrund AWT, Swing, JavaFX & SWT 3
M JMenu auf JComponent? AWT, Swing, JavaFX & SWT 10
G Graphics (g) und JComponent prob. AWT, Swing, JavaFX & SWT 2
G Klasse XYComponent extends JComponent AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben