Warcaby - java swing

0

Cześć, niedawno rozpocząłem naukę Javy i właśnie robię pierwszy mały projekt - grę Warcaby.
Jednak na jego przykładzie chciałbym ogarnąć trochę funkcjonalności Java swing. Pozwolę sobie w tym wątku na bieżąco pisać o problemach które napotykam. Pierwszym z nich jest obsługa myszy, narysowałem planszę do gry i chciałbym aby przy kliknięciu w dane pole w konsoli pojawiał się komunikat o klikniętym polu (np. A-3). Na starcie chciałem wypisać po prostu współrzędne miejsca w które kliknąłem i to mi na razie wystarczy, ze zmianą tego na nazwę pola bez problemu sobie poradzę. Wydaje mi się, że problem tkwi w podpięciu obsługi myszy, jednak jak już mówiłem jestem kompletnym laikiem i będę wdzięczny za każdą pomoc.

package Warcaby;

import javax.swing.*;
import java.awt.*;

public class Szachownica extends JPanel {

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

        setBackground(Color.lightGray);

        //Szachownica
        for(int i = 0; i < 8; i++)
        {
            for(int j = 0; j < 8; j++)
            {
                if((i+j)%2 == 0)
                {
                    g.setColor(Color.white);
                }
                else
                {
                    g.setColor(Color.black);
                }
                g.fillRect(0 + (i * 50), 0 + (j * 50), 50, 50);
            }
        }


    }

    public static void main(String[] args)
    {
        Szachownica s = new Szachownica();
        JFrame frame = new JFrame("Szachownica");
        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new Mouse());
        frame.add(s);
    }
} 




package Warcaby;

import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Mouse extends JPanel implements MouseListener {

    private int x, y;

    @Override
    public void mouseClicked(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        System.out.println(x + ", " + y);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        x = e.getX();
        y = e.getY();
        System.out.println(x + ", " + y);
    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}
2
  1. Mouse nie musi być klasą dziedziczącą z JPanel
  2. frame.addMouseListener(new Mouse());
  3. w klasie Mouse pozycję dostaniesz z
@Override
public void mouseClicked(MouseEvent e) {
    int x=e.getX();
    int y=e.getY();
    System.out.println(x+","+y)
}
0

Do gry dodałem już całą mechanikę i wszystko elegancko działa, problem w tym, że tylko na macierzy w konsoli.
Jedyne z czym nie umiem sobie poradzić to odświeżanie obrazu najlepiej po każdym kliknięciu, ale co jakiś czas (np. co 0.01s) też by przeszło.
Dlatego jeszcze raz proszę o pomoc.

Szachownica odpala się w stanie początkowym, a później już się nie zmienia (w konsoli wszystko działa poprawnie)
screenshot-20200614135231.png

Za wyświetlanie odpowiada główna klasa:

package Warcaby;

import javax.swing.*;
import java.awt.*;

public class Szachownica extends JPanel {

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

        setBackground(Color.lightGray);

        //Szachownica
        for(int i = 0; i < 8; i++)
        {
            for(int j = 0; j < 8; j++)
            {
                if((i+j)%2 == 0)
                {
                    g.setColor(Color.black);
                }
                else
                {
                    g.setColor(Color.white);
                }
                g.fillRect(0 + (i * 50), 0 + (j * 50), 50, 50);
            }
        }

        //Pionki
        Pawns p = new Pawns();
        int temp[][] = p.getTab();

        for(int i = 0; i < 8; i++)
        {
            for(int j = 0; j < 8; j++)
            {
                if(temp[j][i] == 2)
                {
                    g.setColor(Color.red);
                    g.fillOval(5 + (i * 50), 5 + (j * 50), 40, 40);
                }
                else if(temp[j][i] == 1)
                {
                    g.setColor(Color.white);
                    g.fillOval(5 + (i * 50), 5 + (j * 50), 40, 40);
                }
            }
        }
    }

    public static void main(String[] args)
    {
        Szachownica s = new Szachownica();
        JFrame frame = new JFrame("Szachownica");
        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.addMouseListener(new Mouse());
        frame.add(s);
    }
}
0

Wszystko już działa. Do maina dodałem:

while(true)
        {
            frame.repaint();
        }
0

Proponuję dodać to odmalowanie w przypadku jak się coś zmieni w twojej mapie z polami/pionkami.

1 użytkowników online, w tym zalogowanych: 0, gości: 1