W ramach zadania szkolnego muszę stworzyć w Javie grę w statki.
Moja plansza składa się ze 100 przycisków JButton(umieszczonych w dwuwymiarowej tablicy o nazwie "grid") na których możemy je rozmieścić.
Postawienie statku odbywa się poprzez naciśnięcie jeden raz na wybrany JButton i tym samym zmienienie jego koloru. Położenie statku jest zapisywane w ArrayList( PatrolBoatElementsx oraz PatrolBoatElementsy). Statki możemy stawiać tak długo, aż ich ilość w ArrayList nie przekroczy tej ustawionej przeze mnie.
Usunięcie statku odbywa się poprzez dwukrotne naciśnięcie na zamalowany już JButton oraz usunięcie jego koordynatów z ArrayList.
Po tym jak rozstawie wszystkie możliwe statki i usunę jeden wybrany przeze mnie, a następnie z powrotem go rozmieszczę na planszy, wszystko działa poprawnie.
Problem pojawia się w chwili gdy usunę więcej niż jeden statek naraz i chcę je z powrotem rozmieścić. Wtedy program umożliwia mi umieszczenie z powrotem tylko jednego, a ArrayList wciąż przechowuje wszystkie wartości tak jakby nie zostały wcześniej usunięte. Mogę liczyć na jakaś wskazówkę, radę jak rozwiązać ten problem?
Tak wygląda mój kod dla 1 masztowców:
import java.awt.Color;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PatrolBoatO implements Observer {
JPanel ships;
JFrame f;
ActionEvent e;
JButton[][] grid;
MouseListener[][] listeners;
ArrayList<Integer> PatrolBoatElementsx = new ArrayList<Integer>(3);
ArrayList<Integer> PatrolBoatElementsy = new ArrayList<Integer>(3);
public PatrolBoatO(JPanel ships,JFrame f,ActionEvent e,JButton[][] grid) {
this.ships=ships;
this.f=f;
this.e=e;
this.grid=grid;
listeners = new MouseListener[grid.length][grid[0].length];
}
@Override
public void update() {
for (int row = 0; row < grid.length; row++) {
for (int col = 0; col < grid[row].length; col++){
grid[row][col].setEnabled(true);
final int thisRow = row;
final int thisCol = col;
listeners[row][col] = new MouseAdapter() {
public void mouseClicked(MouseEvent event){
System.out.println(thisRow + " "+thisCol);
if (event.getClickCount() == 2) {
((JButton)event.getSource()).setBackground(null);
grid[thisRow+1][thisCol].setEnabled(true);
grid[thisRow+1][thisCol].addMouseListener(listeners[thisRow+1][thisCol]);
grid[thisRow-1][thisCol].setEnabled(true);
grid[thisRow-1][thisCol].addMouseListener(listeners[thisRow-1][thisCol]);
grid[thisRow][thisCol-1].setEnabled(true);
grid[thisRow][thisCol-1].addMouseListener(listeners[thisRow][thisCol-1]);
grid[thisRow][thisCol+1].setEnabled(true);
grid[thisRow][thisCol+1].addMouseListener(listeners[thisRow][thisCol+1]);
PatrolBoatElementsx.remove((Integer)thisRow);
PatrolBoatElementsy.remove((Integer)thisCol);
}
else if((event.getClickCount() == 1)&&(PatrolBoatElementsx.size()<4)) {
((JButton)event.getSource()).setBackground(Color.green);
PatrolBoatElementsx.add(thisRow);
PatrolBoatElementsy.add(thisCol);
grid[thisRow+1][thisCol].setEnabled(false);
grid[thisRow+1][thisCol].removeMouseListener(listeners[thisRow+1][thisCol]);
grid[thisRow-1][thisCol].setEnabled(false);
grid[thisRow-1][thisCol].removeMouseListener(listeners[thisRow-1][thisCol]);
grid[thisRow][thisCol-1].setEnabled(false);
grid[thisRow][thisCol-1].removeMouseListener(listeners[thisRow][thisCol-1]);
grid[thisRow][thisCol+1].setEnabled(false);
grid[thisRow][thisCol+1].removeMouseListener(listeners[thisRow][thisCol+1]);
for(Integer number : PatrolBoatElementsx){
System.out.println("Number = " + number);
}
}}};
grid[row][col].addMouseListener(listeners[row][col]);
}}
f.revalidate();
f.repaint();
}}