JPanel und Graphics2D

Migu

Mitglied
Hallo

ich will wie der Name es schon erahnen lässt eine mit Graphics2D produzierte Graphik auf einem JPanel platzieren, das anschliessend logischerweise in einem JFrame liegen soll.

Hier erstmal mein Code, sollte so lauffähig sein:

Java:
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TestApp {
    
    public static void main(String[] args) {
        
        JFrame mainWindow = new JFrame("Main Window");
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        mainWindow.setSize(800, 300);
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("6");
        list.add("10");
        list.add("20");
        list.add("25");
        list.add("42");
        mainWindow.add(new LottoPanel(50,list));    
        mainWindow.setVisible(true);
    }
}

class Circle {
    
    private int x;
    private int y;
    private int sizeOuter = 70;
    private int sizeInner = 50;
    
    private String number;
    
    public Circle (final int x, final int y, final String number) {
        this.x = x;
        this.y = y;
        this.number = number;
    }   
    
    protected void paintCircle(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.setPaint(Color.black);
        g2.setStroke(new BasicStroke(8));
        g2.drawOval(this.x, this.y, sizeOuter, sizeOuter);
        g2.setColor(Color.red);
        g2.fillOval(this.x, this.y, sizeOuter, sizeOuter);
        
        g2.setPaint(Color.black);
        g2.setStroke(new BasicStroke(2));
        g2.drawOval(this.x+10, this.y+10, sizeInner, sizeInner);
        g2.setColor(Color.white);
        g2.fillOval(this.x+10, this.y+10, sizeInner, sizeInner);
        
        g2.setColor(Color.black);
        Font f = new Font(Font.SERIF, Font.PLAIN, 24);
        g2.setFont(f);
        if (this.number.length() == 1) {
            g2.drawString(this.number,this.x+27, this.y+45);
        }
        else {
            g2.drawString(this.number,this.x+20, this.y+45);
        }
    }
}

class LottoPanel extends JPanel {
    
    private int y;
    private ArrayList<String> numbers;

    public LottoPanel(final int y, final ArrayList<String> numbers) {
        this.y = y;
        this.numbers = numbers;
    }
    
    @Override
    public void paintComponent(Graphics g) {
        // background rectangle
        g.setColor(Color.white);
        g.fillRect(40, 40, 590, 90);
        g.setColor(Color.black);
        g.drawRect(40, 40, 590, 90);
        
        // draw numbers
        int x = 50;
        for(String number : this.numbers) {
            Circle circle = new Circle(x, this.y, number);
            circle.paintCircle(g);
            x += 100;
        }
    }
}

So, führt man dieses Programm aus dann hat man ein einfaches Fenster mit 6 Kreisen mit jeweils eine Zahl in der Mitte.
Mein Problem bezieht sich auf folgende Zeile
[JAVA=26]
mainWindow.add(new LottoPanel(50,list));
[/code]

Hier werden die Zahlen übergeben und die Kreise erzeugt. Das erste Argument an LottoPanel gibt die vertikale Position der Kreise.
So und hier ist genau mein Problem: ich will nun zB ein weiterer LottoPanel zum JFrame hinzufügen aber mit eine anderen y-Koordinate.

Wenn ich aber einfach eine neue Zeile hizufüge mit der geänderten Koordinate dann werden die Kreise nur einmal geplottet und nicht wie ich es will zwei mal, also zwei Zeilen mit jeweils 6 Kreise.

Wo liegt hier mein Fehler??
Muss ich hier evtl mit Layouts arbeiten?

Danke im Vorraus
Migu
 
Zuletzt bearbeitet:
Muss ich hier evtl mit Layouts arbeiten?
Ja.

[JAPI]JFrame[/JAPI] hat als Standardlayout das [JAPI]BorderLayout[/JAPI] (siehe auch How to Use BorderLayout). Wenn du nun
Code:
container.add(component)
machst, ist dies äquivalent zu
Code:
container.add(component, BorderLayout.CENTER)
. Somit überschreibt die zuletzt hinzugefügte Komponente die davor in
Code:
BorderLayout.CENTER
sitzende.
Es ist noch nicht ganz klar, wie du die Panels anordnen willst, daher lässt sich auf die Schnelle kein Layout-Manager empfehlen. Hier werden jedenfalls alle im JRE vorhandenen Layout-Manager vorgestellt.
 
Danke erstmall für die Aufklärung!
Ja das mit den Layouts hatte ich schon vermutet bzw befürchtet.

Ich glaube das BoxLayout das ist was ich suche, also praktisch nur Zeilen

Ich will das zB zwei Zeilen im Code der Form
Java:
mainWindow.add(new LottoPanel(50,list));
mainWindow.add(new LottoPanel(200,otherList));

folgendes bewirken:
Die erste Zeile erzeugt eine Graphik mit 6 Kreisen. Diese befindet sich bei y=50.
Die zweite Zeile erzeugt auch eine Graphik mit 6 Kreisen. Diese befindet sich bei y=200.
Die Sache ist das beide Graphiken im selben JPanel und untereinander (einstellbar durch y) sein sollten.
Die Anzahl der Graphiken die untereinander stehen sollte dynamisch einstellbar sein.
Also dass wenn ich 10 Mal so eine Graphik da stehen haben will, das Layout sich dynamisch anpassen lässt.

Ich kenne mich aber noch nicht so aus mit Layouts.

Migu
 

Zurück
Oben