Cześć, próbuję napisać grę kółko i krzyżyk. Stworzyłem 9 JPaneli w których po kliknięciu rysuje się kółko lub krzyżyk. To czy pojawi się kółko czy krzyżyk zależy od licznika kliknięć (liczba parzysta krzyżyk, nieparzysta kółko. Problem z którym walczę to właśnie ten licznik. Najpierw zrobiłem go wewnątrz tych 9 paneli, zliczał kliknięcia a później przekazywał wartość do PaintComponent gdzie rysowało się kółko lub krzyżyk. Jednak problemem było to, że naciśnięcie każdego przycisku zliczało się osobno. Spróbowałem więc przenieść liczenie kliknięć w miejsce gdzie wywołuję te 9 paneli. Zadziałało nieźle, bo kliknięcia zliczają się odpowiednio.
W tym momencie mam problem z przekazaniem wartości kliknięć z powrotem do JPaneli na które klikam i w których wywołuję PaintComponent.
Zakładam, że to przez to, że każde kliknięcie od nowa wywołuje klasę MainPanel, jednak nie wiem jak przekazać tą wartość w inny sposób.
Bardzo proszę o pomoc.
package XO;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import javax.swing.JPanel;
/**
*
* @author MJ
*/
public class XOJPanel extends JPanel implements MouseListener{
private int var;
public XOJPanel() {
addMouseListener(this);
}
@Override
public void mouseClicked(MouseEvent me) {}
@Override
public void mousePressed(MouseEvent me) {
MainPanel mp = new MainPanel();
mp.getVar();
System.out.println(var);
repaint();
}
@Override
public void mouseReleased(MouseEvent me) {}
@Override
public void mouseEntered(MouseEvent me) {}
@Override
public void mouseExited(MouseEvent me) {}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
if (var%2 == 0 && var > 0 ) {
DrawX(g2d);
}
if (var%2 == 1) {
DrawO(g2d);
}
}
private void DrawX(Graphics2D g2d) {
int x,y;
x = this.getWidth();
y = this.getHeight();
g2d.draw(new Line2D.Double(0,0,x,y));
g2d.draw(new Line2D.Double(0,y,x,0));
}
private void DrawO(Graphics2D g2d) {
int x,y;
x = this.getWidth();
y = this.getHeight();
g2d.draw(new Ellipse2D.Double(0,0,x-1,y-1));
}
}
package XO;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.JPanel;
/**
*
* @author MJ
*/
public class MainPanel extends JPanel{
private int var;
ArrayList<XOJPanel> panels = new ArrayList<XOJPanel>();
public MainPanel() {
setLayout(new GridLayout(3, 3, 20, 20));
setSize(300,300);
setLocation(800/2 - 150, 600/2 - 150);
for (int i = 0; i < 9; i++) {
panels.add(new XOJPanel());
add(panels.get(i));
panels.get(i).addMouseListener(new clickCounter());
}
}
private class clickCounter implements MouseListener {
@Override
public void mouseClicked(MouseEvent me) {}
@Override
public void mousePressed(MouseEvent me) {
var++;
System.out.println(var);
repaint();
}
@Override
public void mouseReleased(MouseEvent me) {}
@Override
public void mouseEntered(MouseEvent me) {}
@Override
public void mouseExited(MouseEvent me) {}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
Line2D line1 = new Line2D.Double(0, 100, 300, 100);
Line2D line2 = new Line2D.Double(0, 200, 300, 200);
Line2D line3 = new Line2D.Double(100, 0, 100, 300);
Line2D line4 = new Line2D.Double(200, 0, 200, 300);
g2d.draw(line1);
g2d.draw(line2);
g2d.draw(line3);
g2d.draw(line4);
}
public int getVar() {
return var;
}
}
package XO;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
* @author MJ
*/
public class MainFrame extends JFrame{
public MainFrame() {
super("Kółko i krzyżyk");
setLayout(null);
JPanel mainPanel = new MainPanel();
add(mainPanel);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
setSize(800,600);
}
}
package XO;
/**
*
* @author MJ
*/
import java.awt.EventQueue;
public class XO {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new MainFrame();
}
});
}
}