MouseListener funktioniert nicht

muff-in

Mitglied
Hallo,

könnte mir jemand helfen? Denn ich bin langsam am verzweifeln. ;(

Es geht um TicTacToe:
Ich habe ein Klasse Gui, die das JFrame erstellt und dann die Klasse Spielbrett aufruft, die wiederum
die Methode paintComponent() in JPanel überschreibt damit das Spielbrett zeichnet.

Dann füllt die Klasse Spielbrett das Array mousePanel[] mit 9 neuen JTextAreas die jeweils auf den Kästchen der TicTacToe Matrix platziert sind (um entweder "O" oder "X" anzeigen zu können) und auf jedem von diesen JTextAreas wird ein MouseListener plaziert.

Ziel:
Wenn das Spielbrett das aller Erste mal gezeichnet wird, sollen diese JTextAreas "z" enthalten.
Und sollte danach der Spieler auf eins von den JTextAreas klicken, soll dieses (mithilfe der Methode mouseClicked (MouseEvent me) in "O" umgeändert werden.

Dabei muss mouseClicked ja überprüfen was für ein Text enthalten ist (um berreits belegte Felder nicht nochmal zu belegen), und dann diesen Text umändern und repaint() aufrufen.

Aber es funktioniert einfach nicht. Kann mit jemand sagen warum?

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.Graphics2D.*;
import java.awt.geom.*;
import java.util.Random;
import java.io.*;

public class GUI extends JFrame {
    
    boolean neu = true;
    boolean win = false;
    boolean[] isClicked = new boolean[9];
    String currentLetter = "z";

    JTextField[] mousePanel = new JTextField[10];

    int[] xlocation = { 53, 103, 153, 53, 103, 153, 53, 103, 153};
    int[] ylocation = { 53, 53, 53, 103, 103, 103, 153, 153, 153};

    int[] xCenter = { 75, 75, 75, 125, 125, 125, 175, 175, 175};
    int[] yCenter = { 75, 125, 175, 75, 125, 175, 75, 125, 175};

    public GUI(String title) {

        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int windowWidth = 600; 
        int windowHeight = 330;

        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((d.width-windowWidth)/2, (d.height-windowHeight)/2, windowWidth, windowHeight);

        setVisible(true);
        setResizable(false);

        Spielbrett p = new Spielbrett();
        JTextArea a = new JTextArea();

        p.setSize(300, 300);
        p.setLocation(0, 0);
        p.setBackground(Color.black);
        p.setVisible(true);

        a.setSize(300, 300);
        a.setLocation(300, 0);
        a.setBackground(Color.black);
        a.setFont(new Font("Monospaced", Font.PLAIN, 15));
        a.setForeground(Color.green);
        a.insert("Welcome to the Matrix.. " , 1);
        a.setVisible(true);

        Container cp = getContentPane();
        cp.setLayout(null);
        cp.add(a);
        cp.add(p);

        this.setContentPane(cp);

    }

    public static void main(String[] args) {
        new GUI("TickTackToe");
    }

    class Spielbrett extends JPanel implements MouseListener{ 

        @Override
        public void paintComponent(Graphics g){

            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(Color.green);

            // paint in Zeitlupe --> vielleicht mit Timer?
            int[] arx = {50, 50, 100, 100, 150, 150, 200, 200};
            int[] ary = {200, 50, 50, 200, 200, 50,  50, 200}; 
            int[] ary2 = {200, 200, 150, 150, 100, 100, 50, 50};

            g.drawPolyline(arx, ary, arx.length);
            g.drawPolyline(ary, ary2, ary.length);

            Font font = new Font("Monospaced", Font.PLAIN, 20);
            for(int i=0; i<9; i++){
                mousePanel[i] = new JTextField();
                mousePanel[i].setSize(44, 44);
                mousePanel[i].setLayout(null);
                mousePanel[i].setLocation(xlocation[i], ylocation[i]);
                mousePanel[i].setBackground(Color.white); //make black finally
                mousePanel[i].setFont(font);
                mousePanel[i].setForeground(Color.green); //make finally black
                mousePanel[i].setVisible(true);
                mousePanel[i].setEditable(false);
                mousePanel[i].addMouseListener(this);

                this.add(mousePanel[i]);
                
                if(neu = true){
                    mousePanel[i].setText(currentLetter);
                }
            } 
        }

        public void mouseClicked (MouseEvent me) {

            int x = me.getX(); 
            int y = me.getY();

            for( int i = 0; i<9; i++){
                if (x > xlocation[i] && x < xlocation[i]+44 && y > ylocation[i] && y < ylocation[i]+44){
                    isClicked[i] = true;
                    if (isClicked[i] = true ){
                        String currentText = mousePanel[i].getText();
                        if (currentText.equals("z")){
                            currentLetter = " O";
                            repaint();
                        }
                    }else { isClicked[i] = false;};
                }
            }
        }

        public void mousePressed (MouseEvent me) {}
        public void mouseReleased (MouseEvent me) {}
        public void mouseEntered (MouseEvent me) {}
        public void mouseExited (MouseEvent me) {}
 
S

SlaterB

Gast
deiner String-Variablen currentLetter einen Wert zuzuweisen macht keinerlei Eindruck auf JTextField-Komponenten,
rufe dort setText() auf,

----

> isClicked = true;
> if (isClicked = true ){

eine Variable auf true zu setzen und dann per if abzufragen ist vollkommen sinnlos,

wenn du umschalten willst, dann z.B.
Java:
isClicked[i] = !isClicked[i];
setzt von true auf false, von false auf true


zudem ist dein if falsch, dort setzt du auch nochmal den boolean,
Vergleich geht mit == statt =, oder noch besser bei boolean nur: if (isClicked){

----

x/y des MouseEvents richtet sich relativ zur Position des GUI-Objektes des Klicks,
wird hier also immer unter 44/44 sein, damit kommt in der Schleife nix dran,

da du die Listener einzeln definierst und nicht auf das ganze Panel (das ginge auch nicht gut, würde nur auf die Klicks auf die Ränder zwischen den Feldern reagieren), kannst du auch einfach getSource() verwenden

((JTextField)me.getSource()).setText(" O");
wäre im Moment eine aktive Befüllung des Listeners

-----

die Definition der TextFelder + Layout usw. muss extrem dringend aus paintComponent() heraus!
das nur einmal im Konstruktor oder so ausführen, ist ja irre

der Inhalt des Konstruktors von GUI steht ja auch nicht in einer paint-Methode des JFrames..
 

tagedieb

Top Contributor
Kann mich dem nur anschliessen.

Hier hab ich mal das nötigste korrigiert...

Java:
package javaforum.examples;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class TicTacToe extends JFrame {

    boolean      neu           = true;
    boolean      win           = false;
    boolean[]    isClicked     = new boolean[9];
    String       currentLetter = "z";

    JTextField[] mousePanel    = new JTextField[10];

    int[]        xlocation     = { 53, 103, 153, 53, 103, 153, 53, 103, 153 };
    int[]        ylocation     = { 53, 53, 53, 103, 103, 103, 153, 153, 153 };

    int[]        xCenter       = { 75, 75, 75, 125, 125, 125, 175, 175, 175 };
    int[]        yCenter       = { 75, 125, 175, 75, 125, 175, 75, 125, 175 };

    public TicTacToe(String title) {

        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        int windowWidth = 600;
        int windowHeight = 330;

        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((d.width - windowWidth) / 2, (d.height - windowHeight) / 2, windowWidth, windowHeight);

        setVisible(true);
        setResizable(false);

        Spielbrett p = new Spielbrett();
        JTextArea a = new JTextArea();

        p.setSize(300, 300);
        p.setLocation(0, 0);
        p.setBackground(Color.black);
        p.setVisible(true);

        a.setSize(300, 300);
        a.setLocation(300, 0);
        a.setBackground(Color.black);
        a.setFont(new Font("Monospaced", Font.PLAIN, 15));
        a.setForeground(Color.green);
        a.insert("Welcome to the Matrix.. ", 1);
        a.setVisible(true);

        Container cp = getContentPane();
        cp.setLayout(null);
        cp.add(a);
        cp.add(p);

        this.setContentPane(cp);

    }

    public static void main(String[] args) {
        new TicTacToe("TickTackToe");
    }

    class Spielbrett extends JPanel implements MouseListener {

        public Spielbrett() {
            setLayout(null);
            Font font = new Font("Monospaced", Font.PLAIN, 20);
            for (int i = 0; i < 9; i++) {
                mousePanel[i] = new JTextField();
                mousePanel[i].setSize(44, 44);
                mousePanel[i].setLayout(null);
                mousePanel[i].setLocation(xlocation[i], ylocation[i]);
                mousePanel[i].setBackground(Color.white); // make black finally
                mousePanel[i].setFont(font);
                mousePanel[i].setForeground(Color.green); // make finally black
                mousePanel[i].setVisible(true);
                mousePanel[i].setEditable(false);
                mousePanel[i].addMouseListener(this);
                mousePanel[i].setText("z");

                this.add(mousePanel[i]);
            }
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(Color.green);

            // paint in Zeitlupe --> vielleicht mit Timer?
            int[] arx = { 50, 50, 100, 100, 150, 150, 200, 200 };
            int[] ary = { 200, 50, 50, 200, 200, 50, 50, 200 };
            int[] ary2 = { 200, 200, 150, 150, 100, 100, 50, 50 };

            g.drawPolyline(arx, ary, arx.length);
            g.drawPolyline(ary, ary2, ary.length);

        }

        public void mouseClicked(MouseEvent me) {

            JTextField source = (JTextField) me.getComponent();
            if (source.getText().equals("z")) {
                source.setText(" O");
                repaint();
            }
        }

        public void mousePressed(MouseEvent me) {
        }

        public void mouseReleased(MouseEvent me) {
        }

        public void mouseEntered(MouseEvent me) {
        }

        public void mouseExited(MouseEvent me) {
        }
    }
}
 
S

SlaterB

Gast
von paintComponent eine Methode aufzurufen ist hier DASSELBE wie den Code darin zu haben,
wird bei jedem paint neu ausgeführt, das darf nicht sein

bei den Locations und der Schleife hast du noch gar nichts gemacht?
na, tagedieb hat ja was fertiges gepostet

(edit: vor deinem edit geschafft ;) )
 

muff-in

Mitglied
Okay, ich bin jetzt etwas verwirrt.
Ging mir vielleicht doch zu schnell.


Aber:
@tagedieb : Danke nochmal, für deinen Code. Es funktioniert endlich. :D *oh yes*
 

muff-in

Mitglied
Noch eine Frage:

Was genau passiert da jetzt?
Besonders die 2. Zeile verstehe ich irgendwie nicht.. :(
Ich weiß, dass das etwas mit den Locations zu tun hat, aber was genau macht denn getComponent()?

Java:
public void mouseClicked(MouseEvent me) {
            JTextField source = (JTextField) me.getComponent();
            if (source.getText().equals("z")) {
                source.setText(" O");
            }
        }
 
S

SlaterB

Gast
man kann nachlesen was die Methode macht oder 1:1 zusammenzählen wenn ein Mausevent eine Komponente zurückgibt?
und der Code dir dann sagen muss dass es ein Textfeld ist, welches du ändern sollst?,
und du auf dem Bildschirm siehst dass es genau das Textfeld ist welches du angeklickt hast?
und nachdem ich auch schon bisschen was dazu geschrieben habe?

da wunderst du dich wirklich noch was getComponent() macht? wie das intern funktioniert kann dir doch recht egal sein,
denkbar dass auch mit Koordinaten hin und her gerechnet wird, wie du es vorher hattest
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G MouseListener funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
D MouseListener funktioniert nach Timerstart nicht mehr Java Basics - Anfänger-Themen 9
P MouseListener funktioniert nicht Java Basics - Anfänger-Themen 6
M MouseListener funktioniert in jar-file nicht mehr Java Basics - Anfänger-Themen 13
R Variablen MouseListener funktioniert auf anderen Pcs nur bedingt Java Basics - Anfänger-Themen 6
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
H MouseListener klicks begrenzen Java Basics - Anfänger-Themen 4
H MouseListener begrenzen und Speichern Java Basics - Anfänger-Themen 1
V Problem - MouseListener/2DGraphics Java Basics - Anfänger-Themen 2
GRAZZ0R MouseListener - Rechteck Bewegen Java Basics - Anfänger-Themen 1
R Variable Klassenübegreifend MouseListener Java Basics - Anfänger-Themen 0
J MouseListener für Schleifen-Objekte Java Basics - Anfänger-Themen 13
S vom JPanel aus durch Mouselistener Internet aufrufen Java Basics - Anfänger-Themen 6
S GUI ImageIcon Mouselistener Link Java Basics - Anfänger-Themen 0
J KeyListener,MouseListener,MouseMotionListener und static Java Basics - Anfänger-Themen 7
P Problem mit MouseListener Java Basics - Anfänger-Themen 4
T MouseListener, recht Taste Java Basics - Anfänger-Themen 2
E Mouselistener auf jTable Java Basics - Anfänger-Themen 18
B Variablen an MouseListener übergeben Java Basics - Anfänger-Themen 5
H MouseListener für ein eingefügtes Bild in einem JFrame Java Basics - Anfänger-Themen 7
H Mouselistener bei JTable Java Basics - Anfänger-Themen 4
G MouseListener für mehrere Buttons Java Basics - Anfänger-Themen 11
J MouseListener fuer gezeichnete Polyline Java Basics - Anfänger-Themen 3
L Label + MouseListener Java Basics - Anfänger-Themen 12
M MouseListener funkioniert auf JPanel nicht Java Basics - Anfänger-Themen 8
P Jtree MouseListener und NoCollapse Java Basics - Anfänger-Themen 2
M Schiebepuzzle: MouseListener und Graphics? Java Basics - Anfänger-Themen 6
M MouseListener Java Basics - Anfänger-Themen 2
kitz MouseListener Java Basics - Anfänger-Themen 8
B MouseListener & Graphics Java Basics - Anfänger-Themen 10
D Problem mit Mouselistener und jtable Java Basics - Anfänger-Themen 7
C fragen zu MouseListener Java Basics - Anfänger-Themen 3
F Logikproblem: Auf Mouselistener warten Java Basics - Anfänger-Themen 6
E Auf Mouselistener warten?! Java Basics - Anfänger-Themen 20
S Probleme mit 2 mouselistener Java Basics - Anfänger-Themen 6
A Frage zu MouseListener Java Basics - Anfänger-Themen 2
D Mouselistener Java Basics - Anfänger-Themen 2
A jPanel an MouseListener übergeben? Java Basics - Anfänger-Themen 2
S Swing JEditoPane MouseListener Java Basics - Anfänger-Themen 5
M Mouselistener Java Basics - Anfänger-Themen 4
S MouseListener funzt net. Java Basics - Anfänger-Themen 5
G MouseListener double click? Java Basics - Anfänger-Themen 1
V MouseListener Java Basics - Anfänger-Themen 5
M MouseListener Java Basics - Anfänger-Themen 3
N Mouselistener? Java Basics - Anfänger-Themen 5
T ein MouseListener pro Objekt sinnvoll? Java Basics - Anfänger-Themen 4
F MouseListener - Unhandled IOException Java Basics - Anfänger-Themen 2
U MouseListener Java Basics - Anfänger-Themen 2
L Array von Buttons, jeder soll MouseListener haben Java Basics - Anfänger-Themen 5
S MouseListener - Events auf Mouseklick Java Basics - Anfänger-Themen 14
L MouseListener Problem. Java Basics - Anfänger-Themen 2
S mouselistener Java Basics - Anfänger-Themen 3
N MouseListener Java Basics - Anfänger-Themen 2
J MouseListener implementieren Java Basics - Anfänger-Themen 12
P MouseListener wird anscheinend nicht benutzt Java Basics - Anfänger-Themen 12
N MouseListener - reagiert zu spät Java Basics - Anfänger-Themen 3
D JList - Textzeilen MouseListener zuweisen Java Basics - Anfänger-Themen 4
M prüfen ob mouselistener gesetzt ist. Java Basics - Anfänger-Themen 10
O image und mouseListener Java Basics - Anfänger-Themen 15
W MouseListener Probleme beim Abfangen Java Basics - Anfänger-Themen 8
P Kann keinen MouseListener hinzufügen Java Basics - Anfänger-Themen 3
G MouseListener einbauen - wie? Java Basics - Anfänger-Themen 4
J Datenüberwachung funktioniert nicht Java Basics - Anfänger-Themen 9
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
J .jar datei öffnen funktioniert nicht Java Basics - Anfänger-Themen 17
G Mit jPackage erstellte EXE funktioniert nicht Java Basics - Anfänger-Themen 2
G Robot funktioniert nicht bei SelectionListener Java Basics - Anfänger-Themen 6
R RegEx funktioniert nicht Java Basics - Anfänger-Themen 14
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
monsterherz Punkt Notation funktioniert nicht Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
ms_cikar Bin to Float convertieren funktioniert nicht Java Basics - Anfänger-Themen 24
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
Garrit1994 Continue funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
B Methoden Übergebe Variabel funktioniert nicht Java Basics - Anfänger-Themen 17
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
Agent4nobody Programmstart durch aufruf des interpreters funktioniert nicht Java Basics - Anfänger-Themen 14
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
U Wie genau funktioniert der ! Operator Java Basics - Anfänger-Themen 3
stormyark 4 Bit in einer for-schleife funktioniert nicht Java Basics - Anfänger-Themen 3
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
M Java printf(Locale.... funktioniert nicht Java Basics - Anfänger-Themen 3
N Wieso funktioniert die Deklaration nicht Java Basics - Anfänger-Themen 3
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
districon Backtracking funktioniert nicht ganz Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben