Я пытаюсь раскрасить отдельные клетки (20x20px), поскольку я начинаю игру жизни Конвея. Когда я нажимаю на экран, я рисую ячейку или удаляю ее в зависимости от состояния ячейки в массиве. Это работает, однако, только одна ячейка может присутствовать на экране в любой момент, и я не уверен, почему, поскольку позиция в массиве ячеек изменяется, если я нажимаю на другую часть экрана.
ГЛАВНЫЙ КОД
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferStrategy;
import java.util.ArrayList;
import java.util.Iterator;
public class mainApplication extends JFrame implements Runnable, MouseListener {
private static final Dimension windowsize = new Dimension(80, 600);
private BufferStrategy strategy;
private static boolean isGraphicsInitialised = false;
private static int rows = 40;
private static int columns = 40;
private static int height = windowsize.height;
private static int width = windowsize.width;
private static ArrayList<Cell> cellsList = new ArrayList<>();
private int xArrayElement,yArrayElement, xPosition, yPosition;
private static boolean gameState[][] = new boolean[rows][columns];
public mainApplication() {
System.out.println(System.getProperty("user.dir"));
setDefaultCloseOperation(EXIT_ON_CLOSE);
Dimension screensize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
int x = screensize.width / 2 - width / 2;
int y = screensize.height / 2 - height / 2;
setBounds(x, y, screensize.width, screensize.height);
setVisible(true);
createBufferStrategy(2);
strategy = getBufferStrategy();
isGraphicsInitialised = true;
// MouseEvent mouseEvent = new MouseEvent();
addMouseListener(this);
// addMouseMotionListener(MouseEvent);
Thread t = new Thread(this);
t.start();
}
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
xArrayElement = (x/20);
yArrayElement = (y/20);
xPosition = x - (x % 20);
yPosition = y - (y % 20);
// cellList.removeIf(cell -> cell.contains(xPosition, yPosition));
Iterator<Cell> iterator = cellsList.iterator();
if (e.getButton() == MouseEvent.BUTTON3) {
while (iterator.hasNext()) {
if (iterator.next().contains(xPosition, yPosition)) {
iterator.remove();
}
}
}
else{
cellsList.add(new Cell(xPosition, yPosition));
}
}
@Override
public void run() {
while (true) {
try { //threads entry point
Thread.sleep(20); //forces us to catch exception
}
catch (InterruptedException e) {
}
}
}
public void paint(Graphics g) {
if (isGraphicsInitialised) {
g = strategy.getDrawGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, 800, 800);
if(cellsList != null) {
for (Cell cell : cellsList) {
cell.paint(g);
System.out.println("test");
}
}
this.repaint();
strategy.show();
}
}
public static void main(String[]args){
mainApplication test = new mainApplication();
}
}
КЛЕТОК КЛАССА
import java.awt.*;
public class Cell {
int x;
int y;
public Cell(int x, int y){
this.x = x;
this.y = y;
}
public boolean contains(int xx, int yy) {
return xx >= x && yy >= y && xx <= x + 20 && yy <= y + 20;
}
public void paint(Graphics g){
g.setColor(Color.white);
g.fillRect(x, y, 20,20);
}
}