Akcja z dwóch buttonów w jednym actionlistenerze

0

Witam

potrzebuje połączenia akcji z dwóch buttonów w jednym listenerze

Chciałbym zaznaczyć sobie w którym napisane jest np. X i po kliknięciu na inne pole ten X się przenosił

Chodzi o akcje przeniesienia się tego X po kliknięciu w drugie pole, bo jak na razie Po kliknięciu X znika, i pojawia się on w innym polu, ale znika za wczesnie.

0

pokaż kod :)

Ale z tego co rozumiem to masz jakąś siatkę buttonów i chcesz przenosić stringa z jednego na drugi.

Jestem bardzo początkujący ale ja bym to zrobił tak:

  1. stwórz statyczne pole "currentlySelected" przechowujące referencje do object.
  2. robisz 2 metody addX oraz removeX.
  3. actionlistener : klikasz na buttona jak currentlySelected == null to wstawiasz referencje buttona do currentlySelected.
  4. jak currentlySelected ma już referencje to wywołujesz removeX na obiekcie currentlySelected oraz addX na buttonie który kliknąłeś.
  5. w tym samym miejscu w kodzie currentlySelected ustawiasz na null.
0

Dzięki na wyjasnienie :) Problem mam, że przy tym wszystko to for

 for(int i = 0; i < 4; i++)
      {
        
          for(int j = 0; j < 4; j++)
          {
            
              if(a.getSource() == button[i][j])
        { 
       current = button[i][j];
       current.SetText = "X";

//i tutaj przykładowo currentold = current.SetText = "0";

Tylko nie wiem jak uzyskać poprzedni current i jak się do niego odwołać.

0

rozumiem że "a" to jest event listenera...?

Nie rozumiem dlaczego iterujesz przez wszystkie buttony skoro a.getSource() to referencja tego buttona którego szukasz.
nie działa Ci to bez pętli? :)

Ja bym zrobił tak ze w polach klasy z listenerami :

private JButton currentlySelected = null;

i zamiast Twojego kodu :

if(currentlySelected == null)                        //sprawdzasz czy masz zaznaczony obiekt
   {
      currentlySelected = a.getSource();             //jeżeli nie ma żadnej referencji to przypisujesz źródło eventa "zaznaczasz obiekt"
   } 
   else                                              //jeżeli masz zaznaczony obiekt to wykonujesz kolejne akcje
      {                                              //jak rozbudujesz projekt to albo zmień typ pola na typ Twojego buttona albo zrób walidacje.
          a.getSource().setText = "X";               //wstawiasz "X" do drugiego przycisku
          currentlySelected.setText = "";            //wstawiasz pusty ciąg znaków do pierwszego
          currentlySelected = null;                  //usuwasz referencje aby można było zaznaczyć kolejny przycisk

          //reszta Twojego kodu, do pierwszego pola odwołujesz się currentlySelected, a do drugiego a.getSource()
      }   

Ale mówię, pisałem to z ręki a doświadczenie mam znikome. Jak doświadczeni forumowicze się obudza to mnie zbesztają XD

0

Wcześniej rysuje 64 buttony, więc taki forem jakoś znajduje współrzędne tego którego kliknąłem :D


 private void makeMove(ActionEvent a)
    {
      String czychar = null; 

      JButton current;
//      JButton currentold;



                      
          for(int i = 0; i < button.length; i++)
      {
        
          for(int j = 0; j < button[0].length; j++)
          {
            
              if(a.getSource() == button[i][j])
        {
                  current = button[i][j];
                  czychar = current.getText();
   //               currentold.setText("");
                  if(czychar == "") Move.setText("Nie zaznaczyłeś piona");
                  if(czychar != "") Move.setText("Wskaż miejsce piona");
                  current.setFont(new Font("SansSerif",Font.BOLD,50));
                  if(playerInt == 1){ current.setText("O");
                  
                  current.setForeground(Color.black);}
                  
                  if(playerInt == 2){ 
                  
                  current.setText("X");
                  current.setForeground(Color.white);}
                  //current.setText(playerChar);
                  current.setEnabled(true);
                  //sprawdzenie czy jest wygrana
                  
                  }
                  
              }
          }
    }


Taki mam kod metody, która wykonuje się po kliknięciu. Myślałem też na rozbicie tego na dwie metody firstmove i secondmove, ale sam nie wiem jak się za to zabrać.

Jestem początkujący, więc nie wiem za bardzo nawet w które miejsce wrzucać ten static object :(

Akurat te przekazywanie stringa strasznie mnie blokuje i nic nie moge na niego wynaleźć :(

0

Wcześniej rysuje 64 buttony, więc taki forem jakoś znajduje współrzędne tego którego kliknąłem

No ale robisz tę pętle tylko po to by uzyskać referencję do button[i][j]:

current = button[i][j];

kiedy ten warunek sprawdza czy referencje są sobie równe:

if(a.getSource() == button[i][j])

Więc skoro są sobie równe (bo warunek przechodzi) to masz tę referencję której szukasz na tacy w a.getSource().

Dodałem commenty do mojego "pseudokodu" więc może Ci pomoże ;P

Myślałem też na rozbicie tego na dwie metody firstmove i secondmove, ale sam nie wiem jak się za to zabrać.

Warunek który napisałem powinien spełniać tę funkcję, bo pierwszy event zawsze ustawi referencje a drugi zawsze ją wyzeruje, więc tak jakby w if masz "firstMove" a w else "secondMove"

0

a.getSource().SetText = "X"; //wstawiasz "X" do drugiego przycisku
currentlySelected.SetText = ""; //wstawiasz pusty ciąg znaków do pierwszego

Przy tych linijkach wyrzuca mi błąd, następna przeszkoda :D

0

cannot find symbol

wydaje mi się, że takim obiektem nie ustawie tekstu. :(

0

Po zmianie, jeszcze wcześniej się bład wyjawił, a tamte nie znikneły

SetText zmianiłem na setText, ale też nadal mam impas

0
  private void makeMove(ActionEvent a)
    {
      String czychar = null; 

      JButton current;
//      JButton currentold;



                      
          for(int i = 0; i < button.length; i++)
      {
        
          for(int j = 0; j < button[0].length; j++)
          {
         
              if(a.getSource() == button[i][j])
        {
          
            if(selected == null)                        //sprawdzasz czy masz zaznaczony obiekt
   {
      selected = a.getSource();             //jeżeli nie ma żadnej referencji to przypisujesz źródło eventa "zaznaczasz obiekt"
   } 
   else                                              //jeżeli masz zaznaczony obiekt to wykonujesz kolejne akcje
      {                                              //jak rozbudujesz projekt to albo zmień typ pola na typ Twojego buttona albo zrób walidacje.
          a.getSource().setText = "X";               //wstawiasz "X" do drugiego przycisku
          selected.setText = "";            //wstawiasz pusty ciąg znaków do pierwszego
          selected = null;                  //usuwasz referencje aby można było zaznaczyć kolejny przycisk
 
          //reszta Twojego kodu, do pierwszego pola odwołujesz się currentlySelected, a do drugiego a.getSource()
      }   
            
        }
                  
       
          
    }}}

  

Cannot find symbol przy
selected.setText = ""; //wstawiasz pusty ciąg znaków do pierwszego
selected = null; //usuwasz referencje aby można było zaznaczyć kolejny przycisk

Wszystko na private JButton selected;

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