2013-05-08 32 views
5

Hôm nay tôi gặp sự cố .. Chương trình của tôi tạo lưới 8x8 và hiển thị điều phối khi tôi nhấp vào JButton.addMouseListener cho JPanel

NHƯNG tôi từ chối sử dụng JButton và tôi cần phải đi cho JPanel .. Nhưng addMouseListener của tôi không được làm việc vì vậy tôi không biết làm thế nào là nó có thể để sửa chữa mà tôi đang tìm kiếm kể từ 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

tôi có thể thiếu một cái gì đó ở đây nhưng 'ActionListener' không là một 'MouseListener' – MadProgrammer

+0

Bạn có nghĩa là' addActionListener' không hoạt động. Đó là vì bạn không thể đăng ký 'JPanel' với loại người nghe này – Reimeus

+0

bạn đang cố gắng thêm người phối ngẫu vào bảng của mình phải không? nhưng mã của bạn là actionListener, không có phương thức listlistener trong JPanel. và tôi nghĩ rằng nó là một ý tưởng tồi để có 64 newMouseListeners, bạn chỉ cần một cho tất cả 64 tấm. do đó, thêm một mouselistener như một tham số trong CaseEchiquier của bạn (int i, int j, MouseListener m) –

Trả lời

6

JPanel không có khả năng ActionListener. Thay vào đó, bạn cần phải sử dụng một 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(); 
      } 
     }); 
    } 
} 

Hãy xem How to Write Mouse Listeners để biết thêm chi tiết ...

+0

Oh đàn ông cảm ơn bạn rất nhiều, tôi đã tìm kiếm từ nhiều giờ ... Và bây giờ tôi hiểu nó hoạt động và tôi có thể nhận được coords bằng cách bấm vào một trường hợp =) – user2360545

+0

Cảm ơn sự giúp đỡ của bạn! Rất hữu ích;) Tuy nhiên, ** làm thế nào tôi có thể nhận được tọa độ từ mỗi trường hợp mà không cần sử dụng "System.out.println". Tôi muốn một cái gì đó như getX() và getY() với chữ AH (cột) và số 1-8 (hàng) ** – user2360545

+0

Điều này sẽ phụ thuộc vào nhiều thông tin hơn bạn thực sự có, bạn sẽ cần phải biết chiều rộng của mỗi cột và chiều cao của mỗi hàng. Một giải pháp tốt hơn có thể là sử dụng thông tin từ chính lớp đó, 'lin' và' col' – MadProgrammer

7

Vấn đề là phương pháp addActionListener không tồn tại đối với JPanel. Bạn nên sử dụng trình nghe thích hợp cho trường hợp này (java.awt.event.MouseListener). Kể từ MouseListener là một giao diện (và bạn không muốn thực hiện tất cả các phương thức của nó), bạn có thể sử dụng một MouseAdapter và ghi đè chỉ là phương pháp (s) bạn cần, như thế này:

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

Cảm ơn bạn rất nhiều tôi đã hiểu ngay bây giờ =) Trợ giúp tuyệt vời! – user2360545

+0

Đây sẽ là câu trả lời đúng .. – TiMr