2013-05-08 21 views
5

Dzisiaj mam problem .. Mój program tworzy siatkę 8x8 i pokazuje współrzędne po kliknięciu na JButton.addMouseListener for a JPanel

ale odmawiam użyć JButton i muszę iść do JPanel .. Ale mój addMouseListener nie działa więc nie wiem, jak to jest możliwe, aby naprawić szukam od 4h .....

package coordboutons; 

    import java.awt.*; 
    import java.awt.event.*; 
    import javax.swing.*; 

    public class CoordBoutons extends JFrame { 

     CoordBoutons() { 
      super("GridLayout"); 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 
      Container contenant = getContentPane(); 
      contenant.setLayout(new GridLayout(8, 8)); 

      for (int i = 0; i < 8; i++) 
       for (int j = 0; j < 8; j++) 
        contenant.add(new CaseEchiquier(i, j)); 

      pack(); 
      setVisible(true); 
     } 

     **class CaseEchiquier extends JPanel** { 
      private int lin, col; 
      CaseEchiquier(int i, int j) { 
       lin = i; 
       col = j; 
       setPreferredSize(new Dimension(80, 75)); 
       setBackground((i + j) % 2 == 0 ? Color.WHITE : Color.GRAY); 
       addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent evt) { 
         System.out.println((char)('a' + col) + "" + (8 - lin)); 

        } 
       }); 
      } 


     } 

     public static void main(String[] args) { 
      JFrame.setDefaultLookAndFeelDecorated(true); 
      CoordBoutons coordBoutons = new CoordBoutons(); 
     } 
    } 
+0

I może być brakuje czegoś tutaj, ale 'ActionListener' nie jest' MouseListener' – MadProgrammer

+0

To znaczy, ' addActionListener' nie działa. To dlatego, że nie możesz zarejestrować 'JPanel' z tym typem odbiornika – Reimeus

+0

twoja próba dodania myszki do twojego panelu w prawo? ale twój kod to actionListener, w JPanel nie ma metody actionlistener. i myślę, że to zły pomysł, aby mieć 64 noweMouseListenery, potrzebujesz tylko jednego na wszystkie 64 panele. więc dodaj myszkę jako parametr w swoim CaseEchiquier (int i, int j, MouseListener m) –

Odpowiedz

6

JPanel nie mają możliwości ActionListener. Zamiast tego trzeba użyć MouseListener

import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class CoordBoutons extends JFrame { 

    CoordBoutons() { 
     super("GridLayout"); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     Container contenant = getContentPane(); 
     contenant.setLayout(new GridLayout(8, 8)); 

     for (int i = 0; i < 8; i++) { 
      for (int j = 0; j < 8; j++) { 
       contenant.add(new CaseEchiquier(i, j)); 
      } 
     } 

     pack(); 
     setVisible(true); 
    } 

    class CaseEchiquier extends JPanel { 

     private int lin, col; 

     CaseEchiquier(int i, int j) { 
      lin = i; 
      col = j; 
      setPreferredSize(new Dimension(80, 75)); 
      setBackground((i + j) % 2 == 0 ? Color.WHITE : Color.GRAY); 
      addMouseListener(new MouseAdapter() { 
       private Color background; 

       @Override 
       public void mousePressed(MouseEvent e) { 
        background = getBackground(); 
        setBackground(Color.RED); 
        repaint(); 
       } 

       @Override 
       public void mouseReleased(MouseEvent e) { 
        setBackground(background); 
       } 
      }); 
//   addActionListener(new ActionListener() { 
//    public void actionPerformed(ActionEvent evt) { 
//     System.out.println((char) ('a' + col) + "" + (8 - lin)); 
// 
//    } 
//   }); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame.setDefaultLookAndFeelDecorated(true); 
       CoordBoutons coordBoutons = new CoordBoutons(); 
      } 
     }); 
    } 
} 

Spójrz na How to Write Mouse Listeners więcej szczegółów ...

+0

O, mężczyźni, dziękuję bardzo, że szukałem od wielu godzin ... A teraz zrozumiałem, że to działa i mogę uzyskać współrzędne, klikając na przypadek =) – user2360545

+0

Dziękuję za pomoc! Bardzo przydatne;) Jednak ** jak mogę uzyskać współrzędne z każdego przypadku bez użycia "System.out.println". Chcę coś takiego jak getX() i getY() z literami AH (kolumna) i liczbami 1-8 (wiersze) ** – user2360545

+0

To będzie zależeć od więcej informacji niż masz, musisz znać szerokość każdej kolumny i wysokość każdego rzędu. Lepszym rozwiązaniem może być wykorzystanie informacji z samej klasy, "lin" i "col" – MadProgrammer

7

problemem jest to, że istnieje metoda addActionListener nie na JPanel. Powinieneś użyć odpowiedniego detektora dla tego przypadku (java.awt.event.MouseListener). Od MouseListener to interfejs (i nie chcesz, aby realizować wszystkie jej metody), można użyć MouseAdapter i nadpisać tylko metody (ów) trzeba, tak:

addMouseListener(new MouseAdapter() { 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     System.out.println((char)('a' + col) + "" + (8 - lin)); 
    } 
}); 
+0

Dziękuję bardzo, zrozumiałem teraz =) Świetna pomoc! – user2360545

+0

To powinna być właściwa odpowiedź .. – TiMr