MouseListener und Repaint()

ClemensG

Mitglied
Hallo Leute,
ich hab mal eine Frage und zwar:
ich schreibe gerade ein Programm (Mastermind <-- weiß nicht, wer das Spiel kennt) für die Schule und ich habe vier Zufallszahlen und ich arbeite mit dem MouseListener...jaa und wenn ich jetzt repaint() mache dann werden die Zufallszahlen neu generiert...gibt es da irgendetwas, wie ich diese Zahlen sich nicht ändern, wenn's repaintet wird? :bahnhof:

Vielen Dank im Vorraus...

Clemens
 

Marco13

Top Contributor
Indem man 'final' davor schreibt - allerdings wird es sich nicht mehr compilieren lassen, weil ja offenbar irgendwo versucht wird, sie DOCH zu ändern ;) Poste mal den relevanten Code, also zumindest wo die Variablen deklariert werden, und wo ihnen neue Werte zugewiesen werden...
 

ClemensG

Mitglied
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowListener;
import java.awt.*;

import javax.swing.*;


public class Engine extends Frame{

public final int[] tmp = new int[4]; // 1 = blau; 2 = grün; 3 = rot; 4 = gelb; 5 = orange; 6 = cyan;
public final int[] zufall = new int[4];


private GamePanel GamePanel = new GamePanel();
private Point mouseco;
protected int xh, yh;
private int chsnclr;

final private int random(){
return (int)(Math.random()*5)+1;
}

public Engine(){
super("Mastermind");
this.setSize(500, 700);
this.addWindowListener(GamePanel);
this.show();
}

public void paint(final Graphics g){
int zähl = 0;
for(int l = 0; l < 4; l++){
zufall[l] = random();
}

for(int i = 75; i <= 300; i += 70){
tmp[zähl] = zufall[zähl];

for(int a = 0; a <= zähl; a++){
for(int k = 0; k <= zähl; k++){
if(tmp[a] == zufall[k]){
zufall[k] = random();
}
}
}

switch(zufall[zähl]){
case 1:
g.setColor(Color.BLUE);
break;
case 2:
g.setColor(Color.green);
break;
case 3:
g.setColor(Color.red);
break;
case 4:
g.setColor(Color.yellow);
break;
case 5:
g.setColor(Color.ORANGE);
break;
case 6:
g.setColor(Color.CYAN);
break;
}

g.fillOval(i, 600, 25, 25);
zähl++;
}

g.setColor(Color.darkGray);
g.fillRect(75, 600, 235, 50);

for(int i = 0; i < 4; i++){
System.out.println(tmp);
}


g.setColor(Color.black);
for(int y = 75; y <= 525; y += 50){
for(int x = 75; x <= 300; x += 70){
g.drawOval(x, y, 25, 25);
}
}

for(int j = 75; j <= 550; j += 50){
for(int i = 350; i <= 400; i += 70){
g.drawOval(i, j, 10, 10);
}
}
for(int j = 90; j <= 540; j += 50){
for(int i = 350; i <= 400; i += 70){
g.drawOval(i, j, 10, 10);
}
}
for(int j = 90; j <= 540; j += 50){
for(int i = 365; i <= 400; i += 70){
g.drawOval(i, j, 10, 10);
}
}
for(int j = 75; j <= 550; j += 50){
for(int i = 365; i <= 400; i += 70){
g.drawOval(i, j, 10, 10);
}
}

g.drawRect(400, 0, 200, 400);
g.setColor(Color.blue);
g.fillOval(435, 60, 25, 25);
g.setColor(Color.green);
g.fillOval(435, 120, 25, 25);
g.setColor(Color.red);
g.fillOval(435, 180, 25, 25);
g.setColor(Color.yellow);
g.fillOval(435, 240, 25, 25);
g.setColor(Color.orange);
g.fillOval(435, 300, 25, 25);
g.setColor(Color.cyan);
g.fillOval(435, 360, 25, 25);

this.addMouseListener(new MouseListener(){

@Override
public void mouseClicked(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
mouseco = e.getPoint();
xh = (int) mouseco.getX();
yh = (int) mouseco.getY();

System.out.println(xh + " | " + yh);

if(xh >= 435 && xh <= 460 && yh >= 60 && yh <= 85){
chsnclr = 1;
System.out.println(chsnclr);
}else if(xh >= 435 && xh <= 460 && yh >= 60*2 && yh <= 85*2){
chsnclr = 2;
System.out.println(chsnclr);
}else if(xh >= 435 && xh <= 460 && yh >= 60*3 && yh <= 85*3){
chsnclr = 3;
System.out.println(chsnclr);
}else if(xh >= 435 && xh <= 460 && yh >= 60*4 && yh <= 85*4){
chsnclr = 4;
System.out.println(chsnclr);
}else if(xh >= 435 && xh <= 460 && yh >= 60*5 && yh <= 85*5){
chsnclr = 5;
System.out.println(chsnclr);
}else if(xh >= 435 && xh <= 460 && yh >= 60*6 && yh <= 85*6){
chsnclr = 6;
System.out.println(chsnclr);
}


}

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
});

g.setColor(Color.blue);
if(xh >= 75 && yh >= 75){
g.fillOval(75, 75, 25, 25);

}


}

public static void main(String args[]){
Engine engine = new Engine();
}
}
das ist alles...also ich mach java auch erst seit nem halben jahr..deswegen könnts ein bischen falsch sein...
 

Marco13

Top Contributor
:shock: In der Tat... Mein Hinweis hätte lauten können/sollen: Generier' sie nicht in der 'paint'. (Grob: In AWT heißt sie paint, in Swing paintComponent). Hat es einen Grund, warum du AWT verwendest? Kann man machen, aber Swing ist moderner und flexibler... Im wesentlichen muss man nur alle Buttons, Panels und Frame durch JButton, JPanel und JFrame ersetzen.

Aber unabhängig davon sollte man i.A. NICHT direkt die paint-Methode eines Frames/JFrames überschreiben. Wenn man etwas zeichnen will, legt man üblicherweise ein JPanel in den JFrame, und überschreibt bei diesem JPanel dann die paintComponent-Methode.

Und das wichtigste: Die paint- bzw. paintComponent-Methode ist NUR zum zeichnen da! Dort sollte NICHTS gerechnet werden, kein Spielablauf gesteuert, und ... keine Zufallszahlen neu generiert... und ... einen MouseListener sollte man dort auch nicht hinzufügen, weil man sonst nach 1000x Neuzeichnen 1000 MouseListener hat :autsch:

Hab' mal angefangen, das GROB zu trennen
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


class MainPanel extends JPanel
{
    private final Engine engine;
    
    MainPanel(Engine engine)
    {
        this.engine = engine;
    }
    
    @Override 
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        
        int zähl = 0;
        for (int i = 75; i <= 300; i += 70)
        {
            switch (engine.zufall[zähl])
            {
                case 1:
                    g.setColor(Color.BLUE);
                    break;
                case 2:
                    g.setColor(Color.green);
                    break;
                case 3:
                    g.setColor(Color.red);
                    break;
                case 4:
                    g.setColor(Color.yellow);
                    break;
                case 5:
                    g.setColor(Color.ORANGE);
                    break;
                case 6:
                    g.setColor(Color.CYAN);
                    break;
            }

            g.fillOval(i, 600, 25, 25);
            zähl++;
        }

        g.setColor(Color.darkGray);
        //g.fillRect(75, 600, 235, 50);

        g.setColor(Color.black);
        for (int y = 75; y <= 525; y += 50)
        {
            for (int x = 75; x <= 300; x += 70)
            {
                g.drawOval(x, y, 25, 25);
            }
        }

        for (int j = 75; j <= 550; j += 50)
        {
            for (int i = 350; i <= 400; i += 70)
            {
                g.drawOval(i, j, 10, 10);
            }
        }
        for (int j = 90; j <= 540; j += 50)
        {
            for (int i = 350; i <= 400; i += 70)
            {
                g.drawOval(i, j, 10, 10);
            }
        }
        for (int j = 90; j <= 540; j += 50)
        {
            for (int i = 365; i <= 400; i += 70)
            {
                g.drawOval(i, j, 10, 10);
            }
        }
        for (int j = 75; j <= 550; j += 50)
        {
            for (int i = 365; i <= 400; i += 70)
            {
                g.drawOval(i, j, 10, 10);
            }
        }

        g.drawRect(400, 0, 200, 400);
        g.setColor(Color.blue);
        g.fillOval(435, 60, 25, 25);
        g.setColor(Color.green);
        g.fillOval(435, 120, 25, 25);
        g.setColor(Color.red);
        g.fillOval(435, 180, 25, 25);
        g.setColor(Color.yellow);
        g.fillOval(435, 240, 25, 25);
        g.setColor(Color.orange);
        g.fillOval(435, 300, 25, 25);
        g.setColor(Color.cyan);
        g.fillOval(435, 360, 25, 25);


        g.setColor(Color.blue);
        if (engine.xh >= 75 && engine.yh >= 75)
        {
            g.fillOval(75, 75, 25, 25);

        }
    }
    
    
}

public class Engine extends JFrame
{
    private static final Random random = new Random(0);
    
    final int[] zufall = new int[4];

    private Point mouseco;
    protected int xh, yh;
    private int chsnclr;


    public Engine()
    {
        super("Mastermind");
        this.setSize(500, 700);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        MainPanel mainPanel = new MainPanel(this);
        mainPanel.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mousePressed(MouseEvent e)
            {
                mouseco = e.getPoint();
                xh = (int)mouseco.getX();
                yh = (int)mouseco.getY();

                System.out.println(xh + " | " + yh);

                if (xh >= 435 && xh <= 460 && yh >= 60 && yh <= 85)
                {
                    chsnclr = 1;
                    System.out.println(chsnclr);
                }
                else if (xh >= 435 && xh <= 460 && yh >= 60 * 2 && yh <= 85 * 2)
                {
                    chsnclr = 2;
                    System.out.println(chsnclr);
                }
                else if (xh >= 435 && xh <= 460 && yh >= 60 * 3 && yh <= 85 * 3)
                {
                    chsnclr = 3;
                    System.out.println(chsnclr);
                }
                else if (xh >= 435 && xh <= 460 && yh >= 60 * 4 && yh <= 85 * 4)
                {
                    chsnclr = 4;
                    System.out.println(chsnclr);
                }
                else if (xh >= 435 && xh <= 460 && yh >= 60 * 5 && yh <= 85 * 5)
                {
                    chsnclr = 5;
                    System.out.println(chsnclr);
                }
                else if (xh >= 435 && xh <= 460 && yh >= 60 * 6 && yh <= 85 * 6)
                {
                    chsnclr = 6;
                    System.out.println(chsnclr);
                }
                repaint();
            }
        });
        
        initRandomNumbers();
        this.getContentPane().add(mainPanel);
        this.setVisible(true);
    }
    
    private void initRandomNumbers()
    {
        for (int l = 0; l < 4; l++)
        {
            zufall[l] = random.nextInt(4);
        }
    }
    

    public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                Engine engine = new Engine();
            }
        });
    }
}

Aber: Du solltest das allgemein mehr strukturieren. Du mußt dir genau überlegen, wie du den Zustand des Spielfeldes repräsentieren willst, und wie er dann gezeichnet werden soll. Überleg' dir am besten mal eine Klasse wie "Spielfeld" oder so, mit den geeigneten settern und gettern die man braucht, um das Spiel spielen zu können....
 

ClemensG

Mitglied
WOW..vielen vielen Dank....:) wirklich...hat mir sehr geholfen...:) Und ich habe AWT werdendet, weil ich ein Buch (Java 4u) habe, wo das alles erklärt wird...mehr oder weniger :)

Thx Clemens
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I AWT MouseListener Extra Knopf auf der Maus Allgemeine Java-Themen 9
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
L Koordinaten des Mouselistener nicht überall gleich Allgemeine Java-Themen 13
B LEERE JTable MouseListener + popupmenu Allgemeine Java-Themen 2
P MouseListener reagiert 2 Mal Allgemeine Java-Themen 11
T Edit: JLabel+MouseListener oeffnet mehrere Instanzen Allgemeine Java-Themen 5
B MouseListener und KeyListener Allgemeine Java-Themen 15
T MouseListener und MouseMotionListener Allgemeine Java-Themen 3
V MouseListener Allgemeine Java-Themen 2
F Wo MouseListener Positionieren Allgemeine Java-Themen 4
E MouseListener Priorität Allgemeine Java-Themen 4
ElViZ MouseListener auf Linie die per drawLine() gezeichnet wurde? Allgemeine Java-Themen 2
S Anonymen MouseListener entfernen? Allgemeine Java-Themen 2
P Bug mouseListener Allgemeine Java-Themen 2
B Programm soll auf die Eingabe vom Mouselistener warten. Allgemeine Java-Themen 19
M 1. Probleme mit MouseListener, 2. Anwendung in Infobar Allgemeine Java-Themen 8
V MouseListener Allgemeine Java-Themen 9
S MouseListener Allgemeine Java-Themen 18
S Problem Mouselistener Allgemeine Java-Themen 6
G Mouselistener geht aber danach Fehler bei JOptionPane Allgemeine Java-Themen 4
R Global KeyListener/MouseListener Allgemeine Java-Themen 4
? AWT Translucent JFrame mit repaint Allgemeine Java-Themen 4
L repaint() methode funktioniert nicht richtig! Allgemeine Java-Themen 3
M repaint() wird nicht ausgeführt Allgemeine Java-Themen 5
T Zugriff zwischen Klassen für repaint Allgemeine Java-Themen 7
P miese performance bei nem BufferedImage + repaint :( Allgemeine Java-Themen 6
1 TextArea: Repaint zu spät Allgemeine Java-Themen 4
D repaint oder update Methode? Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben