2013-05-08 19 views
5

Oggi ho un problema .. Il mio programma crea una griglia 8x8 e mostra il coord quando clicco su un JButton.addMouseListener per un JPanel

ma mi rifiuto di usare JButton e ho bisogno di andare per JPanel .. Ma la mia addMouseListener non funziona così non so come è possibile per risolvere questo sto cercando dal 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

potrei mancare qualcosa qui, ma 'ActionListener' non è un' MouseListener' – MadProgrammer

+0

Vuoi dire ' addActionListener' non funziona. Questo perché non puoi registrare 'JPanel' con questo tipo di ascoltatore – Reimeus

+0

tuo cercando di aggiungere un mouselistener ai tuoi pannelli giusto? ma il tuo codice sais actionListener, non c'è alcun metodo actionlistener in JPanel. e penso che sia una cattiva idea avere 64 newMouseListeners, ne hai solo bisogno uno per tutti i 64 pannelli. quindi aggiungi un mouselistener come parametro nel tuo CaseEchiquier (int i, int j, MouseListener m) –

risposta

6

JPanel non lo fa avere capacità ActionListener. Invece, è necessario utilizzare un 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(); 
      } 
     }); 
    } 
} 

Date un'occhiata a How to Write Mouse Listeners per maggiori dettagli ...

+0

Oh uomini grazie mille ho cercato da lunghe ore ... E ora ho capito che funziona e posso ottenere coords cliccando su un caso =) – user2360545

+0

Grazie per il vostro aiuto! Molto utile;) Tuttavia, ** come posso ottenere le coordinate da ciascun caso senza utilizzare "System.out.println". Voglio qualcosa come getX() e getY() con lettere AH (colonna) e numeri 1-8 (righe) ** – user2360545

+0

Questo dipenderà da più informazioni allora che hai effettivamente, dovresti conoscere la larghezza di ogni colonna e altezza di ogni fila. Una soluzione migliore potrebbe essere quella di usare le informazioni dalla classe stessa, 'lin' e' col' – MadProgrammer

7

il problema è che il metodo addActionListener non fa esiste per un JPanel. È necessario utilizzare l'ascoltatore appropriato per questo caso (java.awt.event.MouseListener). Dal momento che MouseListener è un'interfaccia (e non si desidera implementare tutti i suoi metodi), è possibile utilizzare un MouseAdapter e sovrascrivere solo il metodo (s) è necessario, in questo modo:

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

Grazie mille ho capito ora =) Un grande aiuto! – user2360545

+0

Questa dovrebbe essere la risposta giusta .. – TiMr