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;

0
 selected.setText(""); 

a nie

selected.setText = ""; 

Jest za późno na programowanie, mówiłem że piszę z reki i musisz kontrolować składnie, chodzi o to że przekopiowałem z Twojego pierwszego kodu i jak głupi powtarzałem błąd :P
Dodałem też rzutowanie na JButton.

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

       if(selected == null)                    //sprawdzasz czy masz zaznaczony obiekt
      {
         selected = (JButton)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.
             current = (JButton)a.getSource(); 
             current.setText("X");             //wstawiasz "X" do drugiego przycisku
             selected.setText("");             //wstawiasz pusty ciąg znaków do pierwszego
             
             //reszta Twojego kodu, do pierwszego pola odwołujesz się "selected", a do drugiego "current"

             selected = null;                  //usuwasz referencje aby można było zaznaczyć kolejny przycisk
         }   
 
 
    }}}

Jeżeli masz niezgodność typów "a.getSource()" i "selected" to dodaj tę pętlę w taki sposób jak już musisz, ale tego się chyba tak nie robi ^^ :

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

      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];
              }
          }
      }

       if(selected == null)           //sprawdzasz czy masz zaznaczony obiekt
      {
         selected = current;          //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.
             current.setText("X");    //wstawiasz "X" do drugiego przycisku
             selected.setText("");    //wstawiasz pusty ciąg znaków do pierwszego
           
             //reszta Twojego kodu, do pierwszego pola odwołujesz się "Selected", a do drugiego "current()"

             selected = null;         //usuwasz referencje aby można było zaznaczyć kolejny przycisk
         }   
 
 
    }}}
0

Przy staticu to samo nie chce dać .setText ani do tego obiektu, ani do a.getSource() ;/

0

Pousuwałem niepotrzebne posty. zaktualizowałem mój ostatni. Straszny bałagan się tu zrobił :)

0

Ten kod

      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];
              }
          }
      }

to wielki wtf.
Powinno być

current = (JButton)(a.getSource());

@Laszka, widziałem, że to proponowałeś (trochę za mało nawiasów napisałeś, w efekcie rzutowałeś a, a nie a.getSource()), ale autor wątku jest uparty jak muł.

0

Pisałem kiedyś proste warcaby, planszą była tablica rozmiaru 8x8 obiektów typu JButton. Każdy JButton miał podpiętego tego samego ActionListenera, jeśli na tym polu stał pion, to JButton miał ikonkę (były dwie ikonki, dla białych pionów i dla czarnych pionów). Wizualizacja ruchu, to wymazanie ikonki z buttona startowego i dodanie jej do buttona docelowego.

    class Listener implements ActionListener
    {
        public void actionPerformed(ActionEvent ae)
        {
            JButton p = (JButton)(ae.getSource());
            if(from == null)
            {                
                if(moveCanStart(p)) //sprawdzenie czy na tym polu jest pion i może wykonać ruch
                {
                    from = p;
                }
                return;
            }
            JButton toWhere = (JButton)(ae.getSource());
            if(!moveCanEnd(p)) //sprawdzenie czy ruch może się na tym polu zakończyć
            {
                return;
            }
            toWhere.setIcon(from.getIcon());
            from.setIcon(null);
            from = null;
        }
    }

Naprawdę, pola na planszy były typu Field dziedziczącej po JButton

    class Field extends JButton
    {
        int row;
        int col;
        public Field(int row, int col)
        {
            this.row = row;
            this.col = col;
            setPreferredSize(new Dimension(50,50));
        }
    }

Pola row i col określają pozycję na planszy (0-7), bardzo ułatwiają analizę dopuszczalnych ruchów.

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