2013-05-08 4 views
5

Heute habe ich ein Problem .. Mein Programm machen ein 8x8 Raster und zeigen die Koordinaten, wenn ich auf eine JButton klicke.addMouseListener für ein JPanel

aber ich weigere ich JButton zu verwenden, und ich brauche für JPanel zu gehen .. Aber meine addMouseListener funktioniert nicht, damit ich weiß nicht, wie es möglich ist, zu beheben, dass ich seit 4h bin auf der Suche .....

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

Ich könnte hier etwas fehlt, aber 'ActionListener' ist kein' MouseListener' – MadProgrammer

+0

Sie meinen ' addActionListener' funktioniert nicht. Das liegt daran, dass Sie 'JPanel' nicht mit dieser Art von Listener registrieren können. – Reimeus

+0

Ihr versucht einen Maus-Listener zu Ihren Panels hinzuzufügen, richtig? Aber Ihr Code lautet actionListener, in JPanel gibt es keine actionlistener-Methode. und ich denke, es ist eine schlechte Idee, 64 newMouseListeners zu haben, Sie brauchen nur einen für alle 64 Panels. Fügen Sie also einen Mauslistener als Parameter in Ihren CaseEchiquier ein (int i, int j, MouseListener) –

Antwort

6

JPanel nicht haben ActionListener Fähigkeiten. Stattdessen müssen Sie einen Blick auf How to Write Mouse Listeners, um weitere Informationen Nehmen 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(); 
      } 
     }); 
    } 
} 

verwenden ...

+0

Oh Mann vielen Dank habe ich seit langen Stunden gesucht ... Und jetzt habe ich verstanden, es funktioniert und ich kann Coords durch Klicken auf eine Rechtssache erhalten =) – user2360545

+0

Vielen Dank für Ihre Hilfe! Sehr nützlich;) Wie kann ich jedoch die Koordinaten von jedem Fall erhalten, ohne "System.out.println" zu verwenden. Ich möchte etwas wie getX() und getY() mit Buchstaben AH (Spalte) und Zahlen 1-8 (Zeilen) ** – user2360545

+0

Dies wird von mehr Informationen abhängen, als Sie tatsächlich haben, müssten Sie die Breite jeder Spalte kennen und Höhe jeder Reihe. Eine bessere Lösung könnte darin bestehen, die Informationen aus der Klasse selbst zu verwenden, nämlich "lin" und "col" – MadProgrammer

7

das Problem ist, dass das Verfahren addActionListener nicht für ein JPanel tut existiert. Sie sollten den entsprechenden Listener für diesen Fall verwenden (java.awt.event.MouseListener). Da MouseListener ist (und wollen Sie nicht alle ihre Methoden implementieren) eine Schnittstelle, können Sie eine MouseAdapter verwenden und nur die Methode außer Kraft setzen (s) benötigen Sie, wie folgt aus:

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

Vielen Dank hab ich jetzt verstanden =) Tolle Hilfe! – user2360545

+0

Das sollte die richtige Antwort sein .. – TiMr