Problem mit paint(Graphics g)

JavaKiwi

Mitglied
Hi schlaue Java-Experten 😱)

Ich bin 15 Jahre alt und bringe mir seit drei Wochen Java im Selbststudium bei.
Ich programmiere ein Spiel, bei dem ein
an einer zufälligen Stelle generiertes graues Kästchen (ein Quadrat von kästBreite*kästHöhe, ist aber veränderbar) angeklickt werden muss,
was dann einen Punkt gibt.
Wird das Kästchen verfehlt gibt's nen Minuspunkt. Nach jedem Klick wird neugezeichnet (repaint()) und das Kästchen wird wieder random auf das JPanel gezeichnet.
Das Spiel-Panel kann man dann in ein JFrame integrieren und spielen.

Die Darstellung des Punktestands über drawString() funkt super aber der Punkt/Versuche-Verhältnis-Balken als drawRect() und fillRect() funktioniert noch nicht richtig.

Beim Verhältnis-Balken soll das Verhältnis Punkte:Versuche dargestellt werden.
Der Balken soll also voll sein (144 Pixel), wenn man noch keinen Fehler gemacht hat,
und leer, wenn man noch keinen Treffer hatte.

Als Beispiel: #3 Punkte, 4 Versuche
#3/4 = 0,75
#Länge des Verhältnis-Balkens = 144
#0,75 * 144 = 108
#Balken zeigt also grafisch ca. drei-viertel an (108 Pixel lang)

Jedoch sobald man auch nur einen Klick falsch setzt (sprich: zähler--) funktioniert das nicht mehr.

Dass ich das Anzeigen des Balkens bei Punkte kleiner-gleich Null verhindere, hat den Grund, dass dann der Balken negativ wäre, und das ist ja Schwachsinn. 😀

Ich hoffe ihr wollt (und könnt) mir helfen - das würde mich echt freuen! 😛
Wenn es sonst noch Verbesserungsvorschläge zu meinem Code gibt, bitte sagen! 🙂

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class HauptP extends JPanel
{
    // Zeichenkoordinaten des Kästchens
    static int posX, posY;
    // Kästchenausmaße
    static int kästBreite = 20, kästHöhe = 20;
    //Punkte und Versuche
    static int punkte;
    static int versuche;

    public HauptP()
    {
        super();

        addMouseListener(new Lauscher());
    }

    public void paintComponent(Graphics g)
    {      
        // Test wegen ArithmeticException (Teilen durch 0) und damit Balken nicht negativ
        if(versuche > 0 && punkte > 0)
        {
            // Bildfläche wieder weiß färben
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getWidth(), getHeight());

            // Punktestand anzeigen
            Color c = new Color(77, 155, 77);
            g.setColor(c);
            Font f = new Font("Verdana", Font.BOLD, 16);
            g.setFont(f);
            g.drawString("Punkte: " + punkte, 10, 20);

            // Punkte/Klick-Verhältnis anzeigen
            // Rahmen des Balkens zeichnen
            g.drawString("Punkte/Klick-Verhältnis", 10, 45);
            g.drawRect(223, 30, 150, 15);

            // Balken zeichnen
            int verhältnis = punkte / versuche;
            int verhältnisBalken = verhältnis * 144;
            g.fillRect(225, 32, verhältnisBalken, 10);

            // Quadrat neuzeichnen
            Random rndm = new Random();
            posX = rndm.nextInt(getWidth() - kästBreite); // damit das Kästchen nicht
            posY = rndm.nextInt(getHeight() - kästHöhe);  // größer als das Fenster ist

            g.setColor(Color.DARK_GRAY);
            g.fillRect(posX, posY, kästBreite, kästHöhe);

            g.dispose();
        }
        // Wenn Punktzahl kleiner-gleich Null oder Versuche kleiner-gleich Null, dann ohne Balken zeichnen
        else
        {
            // Bildfläche wieder weiß färben
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getWidth(), getHeight());

            // Punktestand anzeigen
            Color c = new Color(77, 155, 77);
            g.setColor(c);
            Font f = new Font("Verdana", Font.BOLD, 16);
            g.setFont(f);
            g.drawString("Punkte: " + punkte, 10, 20);

            // Quadrat neuzeichnen
            Random rndm = new Random();
            posX = rndm.nextInt(getWidth() - kästBreite);
            posY = rndm.nextInt(getHeight() - kästHöhe);

            g.setColor(Color.DARK_GRAY);
            g.fillRect(posX, posY, kästBreite, kästHöhe);

            g.dispose();
        }
    }

    private class Lauscher extends MouseAdapter
    {
        public void mousePressed(MouseEvent me)
        {
            int x = me.getX();
            int y = me.getY();

            // wenn Klick innerhalb des Kästchens liegt, einen Punkt
            if( (x >= posX && x <= (posX + kästBreite)) && (y >= posY && y <= (posY + kästHöhe)) )
            {
                punkte++;
                versuche++;
                repaint();
            }
            // wenn nicht, einen Punkt Abzug
            else
            {
                punkte--;
                versuche++;
                repaint();
            }
        }
    }
}

Hoffentlich ist der Code nicht zu lang und Danke für eure Hilfe! ;-)
 
Zuletzt bearbeitet:
Du verwendest Swing. Und in Swing verwendet man nicht paint(Graphics) sondern paintComponent(Graphics).
 
Wie wäre es damit?

Java:
public void paintComponent(Graphics g) {
	super.paintComponent(g);
	
	Color c = new Color(77, 155, 77);
	g.setColor(c);
	Font f = new Font("Verdana", Font.BOLD, 16);
	g.setFont(f);
	g.drawString("Punkte: " + punkte, 10, 20);

	if(versuche != 0) {
		g.drawString("Punkte/Klick-Verhältnis", 10, 45);
		g.drawRect(223, 30, 150, 15);
		 
		// Balken zeichnen
		double verhältnis = (double)punkte / (double)versuche;
		int verhältnisBalken = (int) (verhältnis * 144);
		g.fillRect(225, 32, verhältnisBalken, 10);
	}
	
	replaceRectangle();
	g.setColor(Color.DARK_GRAY);
	g.fillRect(posX, posY, kästBreite, kästHöhe);
	
	g.dispose();
}
private void replaceRectangle() {
	Random rndm = new Random();
	posX = rndm.nextInt(getWidth() - kästBreite);
	posY = rndm.nextInt(getHeight() - kästHöhe);
}

Ich finde es allerdings sowohl spiel- als auch programmtechnisch keine gute Idee, das Quadrat in der paintC. neu zu platzieren.

Ich finde deine Variablennamen ebenfalls nicht allzu gut. posX/Y? Von was die Position? verhältnisBalken? Wo ist da der Balken, ich sehe nur ne Zahl. ^^
 
Vielen, vielen Dank!

Super, funktioniert alles! :applaus: :toll:
Und bei den Variablennamen sollte ich vielleicht mal ein bisschen konkreter werden, hast Recht! 😳
 

Zurück
Oben