2D-Grafik paintcomponent Probleme beim zeichnen

basti_44

Mitglied
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.
 

basti_44

Mitglied
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

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

basti_44

Mitglied
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.
 

mihe7

Top Contributor
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());
    }
}
 

basti_44

Mitglied
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. :]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
A Probleme mit paintComponent & BorderFactory AWT, Swing, JavaFX & SWT 2
A Probleme mit paintComponent() AWT, Swing, JavaFX & SWT 2
N Probleme mit paintComponent und GradientPaint AWT, Swing, JavaFX & SWT 5
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
H new Operator in paintComponent - Speicherprobleme vorprogrammiert? AWT, Swing, JavaFX & SWT 2
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
G update, paintComponent AWT, Swing, JavaFX & SWT 1
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
D PaintComponent wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
K Swing paintComponent, JPanel auslagern, ChangeEvents AWT, Swing, JavaFX & SWT 7
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
B AWT paintComponent wird nur 2 mal ausgeführt?! AWT, Swing, JavaFX & SWT 5
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
D paintComponent() mit transparentem Hintergrund. AWT, Swing, JavaFX & SWT 0
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3
M Swing paintComponent in rekusivem JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 2
M DefaultTableModel ruft paintComponent auf ! AWT, Swing, JavaFX & SWT 4
T Swing paintComponent(); AWT, Swing, JavaFX & SWT 24
K Swing JButton paintComponent überschreiben AWT, Swing, JavaFX & SWT 5
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
B 2D-Grafik paintComponent für rechteckigen Bereich? AWT, Swing, JavaFX & SWT 6
P Swing problem mit paintComponent AWT, Swing, JavaFX & SWT 2
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
K paintComponent nicht aufgerufen AWT, Swing, JavaFX & SWT 2
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
W JPanel Überschreiben // paintComponent? AWT, Swing, JavaFX & SWT 4
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
P JLabel paintComponent AWT, Swing, JavaFX & SWT 3
Z Swing paintcomponent und menbar Problem AWT, Swing, JavaFX & SWT 3
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
A paintComponent AWT, Swing, JavaFX & SWT 4
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
K JPanel und paintComponent AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
J paintComponent() übergeben AWT, Swing, JavaFX & SWT 4
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
kodela Swing paintComponent() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 19
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
E WARUM wird paintComponent nicht aufgerufen? AWT, Swing, JavaFX & SWT 12
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
G Swing paintComponent Effizienz? AWT, Swing, JavaFX & SWT 4
R paintComponent Kollision AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
T Swing paintComponent problem AWT, Swing, JavaFX & SWT 3
MrGe getWidth(); getHeight(); außerhalb von paintComponent AWT, Swing, JavaFX & SWT 4
A paintComponent überdeckt ... AWT, Swing, JavaFX & SWT 13
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
F Wer ruft paintComponent() Methode auf? AWT, Swing, JavaFX & SWT 9
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
G paintComponent Problem AWT, Swing, JavaFX & SWT 6
T paintComponent() überschreiben: Platz für Border freihalten? AWT, Swing, JavaFX & SWT 6
G paintComponent JPanel im JApplet AWT, Swing, JavaFX & SWT 2
X Speichern in der paintComponent() Methode AWT, Swing, JavaFX & SWT 15
W JLabel + paintComponent AWT, Swing, JavaFX & SWT 2
V Wieviel Logik in paintComponent? AWT, Swing, JavaFX & SWT 7
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
G paintComponent() Methode für JPanel in NetBeans überschreibe AWT, Swing, JavaFX & SWT 2
L Problem mit paintComponent() under java < 1.6 under Windo AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
G paintComponent wird nicht dargestellt AWT, Swing, JavaFX & SWT 5
T Kuchendiagramm - mit paintComponent nach JButton druck zeich AWT, Swing, JavaFX & SWT 4
R paintComponent wird anscheinend nicht aufgerufen AWT, Swing, JavaFX & SWT 2
T JPanel mit paintComponent methode im JInternalFrame AWT, Swing, JavaFX & SWT 3
M super.paintComponent(g); aufrufen oder nicht? AWT, Swing, JavaFX & SWT 8
M Unterschied zwischen paintComponent() und paint()? AWT, Swing, JavaFX & SWT 4
D JTextArea in der paintComponent () hinzufügen? AWT, Swing, JavaFX & SWT 9
raptorrs J2D paintComponent: Nur ganzzahlige (-int) Werte möglich? AWT, Swing, JavaFX & SWT 3
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben