2D-Grafik paintcomponent Probleme beim zeichnen

Hallo Leute, ich bin bereits fix und fertig vom Forenbeiträge durchforsten konnte aber leider nix passendes für mein Problem finden.

Ich habe mir eine paintcomponent Methode geschrieben die mir für ein Spielbrett ein rundes Feld printen soll, dass funktioniert soweit auch ganz gut nur suche ich eine Möglichkeit die Felder mit verschiedenen Farben zu zeichnen. Aber hier erstmal der Code.

Java:
package gui;
import javax.swing.JPanel;


import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.color.ColorSpace;
import java.awt.geom.Ellipse2D;

class Circles extends JPanel
{
    public static String string;
    
    public Circles(String string)
    {
        this.string = string;
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        int rr;
        int gg;
        int b;
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(new Color(rr = 204, gg = 164, b = 96));
        g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
        g2d.setColor(Color.BLACK);
        int mx = 30;
        int my = 30;
        int r = 30;
        Ellipse2D.Double außenkreis = new Ellipse2D.Double(mx - r, my - r, 2 * r, 2 * r);
        g2d.draw(außenkreis);
        g2d.fill(außenkreis);
        if(string.contentEquals("red"))
        {
            g2d.setColor(Color.RED);
        }
        if(string.contentEquals("white"))
        {
            g2d.setColor(Color.WHITE);
        }
        if(string.contentEquals("yellow"))
        {
            g2d.setColor(Color.YELLOW);
        }
        if(string.contentEquals("blue"))
        {
            g2d.setColor(Color.BLUE);
        }
        mx = 30;
        my = 30;
        r = 27;
        Ellipse2D.Double kreis = new Ellipse2D.Double(mx - r, my - r, 2 * r, 2 * r);
        g2d.draw(kreis);
        g2d.fill(kreis);
    }
    public static void setString(String string)
    {
        Circles.string = string;
    }
Meine Idee war beim erschaffen eines Objektes der Klasse Circle einen String mitzugeben um mit diesen durch equalscontent die passende Farbe auswählen zu können.
So wie es aussieht wird paintcomponent() aber erst zum Schluss aufgerufen und nimmt damit vom zuletzt erstellten CirclesObjekt den String und damit die jeweilige Farbe. Dadurch haben dann alle Felder diese Farbe.
Gibt es eine Möglichkeit irgendwie durch repaint() ihn nach jedem Objektentwurf zeichnen zu lassen?
Oder ist das der komplett falsche Ansatz und garnicht realisierbar.

Ich hoffe irgendwer hat einen kleinen Tip für mich. Vielen Dank schonmal.
 
Oh man, ist anscheinend schon eine Weile her. -_-
Das sind die guten alten nicht vorhandenen Basics. Jetzt geht es natürlich, vielen Dank!
 
K

kneitzel

Wieso statt dem Text nicht einfach die Farbe selbst speichern? Dann brauchst Du diese Abfragen nicht mehr. Und Variablen sollten einen vernünftigen Namen haben und nicht einfach string heißen.....
 
Wofür soll das gut sein?
Wieso statt dem Text nicht einfach die Farbe selbst speichern? Dann brauchst Du diese Abfragen nicht mehr. Und Variablen sollten einen vernünftigen Namen haben und nicht einfach string heißen.....
Stimmt natürlich, den direkten Zugriff hatte ich schon probiert und dort war es auch der static Fehler wodurch es nicht ging. Dann bin ich im weiteren probieren bei diesem Konstrukt gelandet. Das mit dem Variablen Namen stimmt natürlich. ^^
Danke für die Hinweise.
 
Ich zeichne die Grafik als JPanel auf eine JFrame
Nö, Du zeichnest nicht auf einem JFrame, Du fügst die Komponente dem Content-Pane (ein Container) Deines JFrames hinzu.

Ein JPanel ist als Behälter für weitere Komponenten gedacht. Wenn Du also z. B. im Hintergrund anderer Komponenten ein Bild anzeigen willst, dann wäre es passend, von JPanel abzuleiten. Wenn ich es richtig sehe, willst Du einfach nur eine Komponente bauen, das wäre dann JComponent:

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;

public class Circles extends JComponent {
    private Color outerColor;
    private int outerRadius;
    private int innerRadius;

    public Circles(int radius, Color innerColor) {
        innerRadius = radius;
        outerRadius = radius+2;
        setForeground(innerColor);
        outerColor = Color.BLACK;
    }

    void setOuterRadius(int r) {
        outerRadius = r;
        repaint();
    }

    void setInnerRadius(int r) {
        innerRadius = r;
        repaint();
    }

    void setOuterColor(Color c) {
        outerColor = c;
        repaint();
    }

    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }

        Insets insets = getInsets();
        int w = (insets.left + insets.right + Math.max(outerRadius, innerRadius));
        int h = (insets.top + insets.bottom + Math.max(outerRadius, innerRadius));
        return new Dimension(w, h);
    }

    @Override
    protected void paintComponent(Graphics gr) {
        Graphics2D g = (Graphics2D) gr;
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
                RenderingHints.VALUE_STROKE_PURE);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        Insets insets = getInsets();
        int maxWidth = getWidth() - insets.left - insets.right;
        int maxHeight = getHeight() - insets.top - insets.bottom;

        if (isOpaque()) {
            g.setColor(getBackground());
            g.fillRect(insets.left, insets.top, maxWidth, maxHeight);
        }

        int centerX = insets.left + maxWidth/2;
        int centerY = insets.top + maxHeight/2;

        drawCircle(g, centerX, centerY, outerRadius, outerColor);
        drawCircle(g, centerX, centerY, innerRadius, getForeground());
    }

    private void drawCircle(Graphics2D g, int cx, int cy, int radius, Color color) {
        Ellipse2D circle = new Ellipse2D.Float(cx - radius, cy - radius, 
                2*radius, 2*radius);
        g.setColor(color);
        g.draw(circle);
        g.fill(circle);
    }
}
Java:
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.*;

public class Test {

    public void run() {
        Color[] colors = {Color.yellow, Color.blue, Color.red, Color.green};
        JPanel p = new JPanel(new GridLayout(0,5));
        for (int i = 0; i < 10; i++) {
            p.add(new Circles(30, colors[i % colors.length]));
        }

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(p);
        frame.setSize(800, 600);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Test().run());
    }
}
 
Nö, Du zeichnest nicht auf einem JFrame, Du fügst die Komponente dem Content-Pane (ein Container) Deines JFrames hinzu.

Ein JPanel ist als Behälter für weitere Komponenten gedacht. Wenn Du also z. B. im Hintergrund anderer Komponenten ein Bild anzeigen willst, dann wäre es passend, von JPanel abzuleiten. Wenn ich es richtig sehe, willst Du einfach nur eine Komponente bauen, das wäre dann JComponent:
Ja da hast du recht, ich habe gedacht das wäre der richtige Weg. Ist mein erstes kleines Projekt mit Gui, also ein bisschen learning by doing. ^^
Ich werde mich mal in deinen Code reinlesen, vielen Dank. :]
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben