Kółko i krzyżyk GUI, NetBeans

0

Witam.

Moim zadaniem jest stworzenie gry Kółko i Krzyżyk z interfejsem graficznym, do grania z komputerem.
Algorytm do gry już mam (w C++ co prawda, ale przerobić go do Javy to żaden problem).

Chodzi o to, że wcześniej nie robiłem nic w Javie "okienkowej".
Używam NetBeans.

Pomyślałem, że najłatwiej będzie jako elementy planszy użyć Buttony, i zmieniać na nich ikony (z plików png).

Na tą chwilę chcę, aby klikając na przycisk, ikona zmieniała się z kółka na krzyżyk i na odwrót.
Na początku nie ma żadnej ikony.

Ale jak to bywa coś musi nie działać. Kod jest taki

private void jButton5MouseClicked(java.awt.event.MouseEvent evt) {
        // TODO add your handling code here:
      ClassLoader cldr = this.getClass().getClassLoader();

    java.net.URL imageURL   = cldr.getResource("kolko_krzyzyk/resources/O.png");
    ImageIcon O = new ImageIcon(imageURL);
    jButton5.setIcon(O);

    imageURL   = cldr.getResource("kolko_krzyzyk/resources/X.png");
    ImageIcon X = new ImageIcon(imageURL);

    if (jButton5.getIcon() == X)
        jButton5.setIcon(O);
    else
        jButton5.setIcon(X);

    jTextField1.setText(jButton5.getIcon().toString());
    } 

Efekt jest taki, że po pierwszym kliknięciu ładuje się X, ale później już nic się dzieje.

0

To proste.
W if masz == czyli sprawdzasz, czy obiekt, który zaczytałeś teraz jest równy obiektowi, który jest w pamięci po poprzednim kliknięciu. A nie jest równy, bo to dwa różne obiekty w pamięci.
Operator == porównuje dwie referencje w pamięci.
Możesz zrobić tak:
Dodaj do klasy reprezentującej przycisk pole name i sprawdzaj, czy getName().equals("X"), lub czy getName().equals("O")
i już

0

Zmieniłem na:

if (jButton5.getIcon().toString().equals(X.toString()))
        jButton5.setIcon(O);
    else
        jButton5.setIcon(X); 

toString() zwraca całą ścieżkę do pliku. Dalej nie działa.

0

Robię to z głowy, bez kompilatora, sprawdź poniższy kod:

private void jButton5MouseClicked(java.awt.event.MouseEvent evt) {
      ClassLoader cldr = this.getClass().getClassLoader();

    java.net.URL imageURL   = cldr.getResource("kolko_krzyzyk/resources/O.png");
    ImageIcon O = new ImageIcon(imageURL);
    jButton5.setIcon(O);
    jButton5.setName("O");

    imageURL   = cldr.getResource("kolko_krzyzyk/resources/X.png");
    ImageIcon X = new ImageIcon(imageURL);

    if (jButton5.getName.equals("X"))
        jButton5.setIcon(O);
        jButton5.setName("O")
    else
        jButton5.setIcon(X);
        jButton5.setName("X");

    jTextField1.setText(jButton5.getIcon().toString());
    } 
 

PS: Właśnie się kapłem, kod jest w ogóle nie poprawny.
zobacz, co tu robimy,
Po kliknięciu przycisku ustawiamy jego ikone na O, po czym sprawdzamy, jeśli jest O to ustawiamy X.
Trzeba to jakoś inaczej wykombinować.

Pozdrawiam.

0

Niestety, dalej to nie działa...

EDIT:

Już działa. jButton5.setName("O"); nie może być przy każdorazowym wywołaniu metody :)
Przeniosłem do kodu obiektu i jest OK.

Dzięki.

0

No właśnie o to mi chodziło, ale jestem w pracy nie mogłem nic zakodować :)

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