Gra w statki, grafika

0

Witam,

programuję od niedawna i w ramach ćwiczenia postanowiłem napisać grę w statki, od strony logicznej gra działa ok, ale chciałbym również dołączyć grafikę i tu mam problem.
Plansza mojej gry ma wielkość 10 x 10. Więc dodałem 100 buttonów i teraz mam pytanie czy muszę do każdego przycisku dodawać odbiorcę zdarzeń i metodę actionPerformed osobno, a następnie w samej metodzie określać o jakie pole w mojej tablicy chodzi, jak niżej

  public void actionPerformed(ActionEvent zdarzenie) {

        if(robol.statki[0][0] == 1){
            A1.setText("Trafiony");
            if(robol.statki[1][0] == 0 && robol.statki[0][1] == 0){
                A1.setText("Zatopiony");
            }
        }
        else{
            A1.setText("Pudło");
        }
    }

i tak dla każdego z przycisków osobno?. Czy istnieje jakiś szybszy sposób? Zastanawiam się czy jest możliwe, żeby przy tworzeniu przycisków w pętli automatycznie odwoływały się do odpowiednich pól mojej tablicy statki?Tak, żebym nie musiał tworzyć unikalnego kody w metodzie actionPerformed dla każdego przycisku.

Z góry dzięki za pomoc.

0

Możesz w pętli dodawać eventHandler który wywoła metodę z pozycją przycisku

for(int i = 0; i<10; ++i){
   for(int j = 0; j<10; ++j){
       Button btn = new Button();
       btn.setOnAction(ev -> buttonClicked(i, j));
   }
}

W metodzie buttonClicked(int i, int j) obsługujesz zdarzenie wciśnięcia konkretnego przycisku.

0

Dzięki, jednak nie bardzo wiem jak dodawać eventHandler, byłbym wdzięczny gdybyś wyjaśnił bardziej szczegółowo lub dał linka gdzie byłoby to pokazane

0

Ziomuś, w kodzie powyżej już masz ustawiony event handler setOnAction. Weź ten kod i napisz metodę buttonClicked(int i, int j), to wszystko co musisz zrobić.

0
farmer_tedd napisał(a):

Dzięki, jednak nie bardzo wiem jak dodawać eventHandler, byłbym wdzięczny gdybyś wyjaśnił bardziej szczegółowo lub dał linka gdzie byłoby to pokazane

to zależy bo np. @krzysiek050 podał przykład w JavaFX a z tego co widzę to Ty piszesz w Swing-u więc u Ciebie to powinno wyglądać mniej więcej tak

 for(int i = 0; i<10; ++i){
   for(int j = 0; j<10; ++j){
       JButton btn = new JButton();
       btn.addActionListener(ev -> buttonClicked(i, j));
   }
}
0

Dodałem tak jak napisałeś


 public void dzialaj(){
        statki = new Statki();

        JFrame ramka = new JFrame();
        JPanel panel = new JPanel();

        for( int i = 0; i<10; i++){
            for(int j = 0; j<10; j++){
                btn = new JButton();
                btn.addActionListener(ev -> buttonClicked(i, j));
                panel.add(btn);
            }
        }

        ramka.getContentPane().add(BorderLayout.CENTER,panel);
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ramka.setSize(500,350);
        ramka.setVisible(true);

        statki.graj();
    }

i zdefiniowałem metodę buttonClicked


public void buttonClicked(int i, int j){
        System.out.println(i + ", " + j);
        if(statki.robol.statki[i][j]==1){
            btn.setText("trafiony");
        }
        else{
            btn.setText("pudło");
        }
    }

i dostaję taki komunikat

local variables referenced from a lambda expression must be final or effectively final

odnośnie składowych 'i' i 'j' w pętli przy dodawaniu zdarzenia

1

Jednym ze sposobów na rozwiązanie tego problemu jest przypisanie zmiennych do pól final i przekazanie ich do lambdy.

0

mam jeszcze jedno pytanie, w metodzie buttonClicked chcę ustawić, żeby za każdym kliknięciem danego przycisku, przycisk ten został usunięty,a w jego miejsce został wstawiony plik jpg, i tu mam problem, bo jpg pojawia się dopiero po zminimalizowaniu okna, co zrobić ,żeby plik jpg uwidocznił się bezpośrednio po kliknięciu?

public void buttonClicked(int i, int j) {
        int indeks = i*10 + j;
        panel2.remove(przyciski[i][j]);
        mojObraz = new JLabel(new ImageIcon(("C:\\Users\\Admin\\Desktop\\moje.jpg")));
        panel2.add(mojObraz, indeks);
        ramka.repaint();
    }

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