2013-04-24 35 views
5

में एक विशिष्ट सेल खोजने के लिए माउसलिस्टर का उपयोग कैसे करें मैं कोशिकाओं से बना 10 x 10 ग्रिड के साथ जावा गेम बनाने की कोशिश कर रहा हूं। ग्रिड liks इस दिखता है:ग्रिड

public class Grid extends JPanel implements MouseListener { 
    public static final int GRID_SIZE = 10; 

    public Grid() { 
     setPreferredSize(new Dimension(300, 300)); 
     setLayout(new GridLayout(GRID_SIZE, GRID_SIZE)); 

     for (int x = 0; x < GRID_SIZE; x++) 
      for (int y = 0; y < GRID_SIZE; y++) 
       add(new Cell(x, y)); 
     addMouseListener(this); 
    } 

// All Mouse Listener methods are in here. 

सेल वर्ग इस तरह दिखता है:

public class Cell extends JPanel { 

    public static final int CELL_SIZE = 1; 
    private int xPos; 
    private int yPos; 

    public Cell (int x, int y) { 
     xPos = x; 
     yPos = y; 
     setOpaque(true); 
     setBorder(BorderFactory.createBevelBorder(CELL_SIZE)); 
     setBackground(new Color(105, 120, 105)); 
     setPreferredSize(new Dimension(CELL_SIZE, CELL_SIZE)); 
    } 

    // Getter methods for x and y. 

मेरे मुद्दा यह है कि मैं अब ग्रिड कक्षा में MouseListeners लागू करने के लिए कोशिश कर रहा हूँ है। मैंने जो महसूस किया है वह यह है कि जब तक मैं ग्रिड के एक्स और वाई निर्देशांक वापस कर सकता हूं, मैं कोशिकाओं को स्वयं में हेरफेर नहीं कर सकता। मुझे लगता है कि ऐसा इसलिए है क्योंकि जब मैंने उन्हें ग्रिड में बनाया था, तो मैं 100 पहचानकर्ता सेल बना रहा हूं जिसमें कोई पहचानकर्ता नहीं है और इसलिए मेरे पास सीधे पहुंचने का कोई तरीका नहीं है।

क्या कोई मुझे इस पर सलाह दे सकता है? क्या मुझे अपने कोड को ओवरहाल करने की आवश्यकता है और जिस तरह से मैं कोशिकाएं बना रहा हूं? क्या मैं बहुत बेवकूफ हूं और उन्हें एक्सेस करने का एक स्पष्ट तरीका याद कर रहा हूं? धन्यवाद

उत्तर

2

आप नीचे दिखाए गए अनुसार एडाप्टर पैटर्न का उपयोग कर सकते हैं। इस तरह, आप व्यक्तिगत रूप से प्रत्येक ग्रिड सेल में श्रोता जोड़ सकते हैं, लेकिन अभी भी Grid से ईवेंट को संभाल सकते हैं।

ध्यान दें कि Grid अब MouseListener लागू करता है, यह अब कोशिकाओं द्वारा संभाला जाता है।

public class Grid extends JPanel { 
    public static final int GRID_SIZE = 10; 

    public Grid() { 
     setPreferredSize(new Dimension(300, 300)); 
     setLayout(new GridLayout(GRID_SIZE, GRID_SIZE)); 

     for (int x = 0; x < GRID_SIZE; x++) { 
      for (int y = 0; y < GRID_SIZE; y++) { 
       final Cell cell = new Cell(x, y); 
       add(cell); 
       cell.addMouseListener(new MouseListener() { 
        public void mouseClicked(MouseEvent e) { 
         click(e, cell); 
        } 
        // other mouse listener functions 
       }); 
      } 
     }   
    } 

    public void click(MouseEvent e, Cell cell) { 
     // handle the event, for instance 
     cell.setBackground(Color.blue); 
    } 

    // handlers for the other mouse events 
} 

एक उपवर्ग के रूप में इस रद्द कर सकते थे:

public class EnemyGrid extends Grid { 
    public void click(MouseEvent e, Cell cell) { 
     cell.setBackground(Color.red); 
    } 
} 
+0

यह कोड का वास्तव में उपयोगी टुकड़ा है - धन्यवाद! क्या मैं एक फॉलो अप प्रश्न पूछ सकता हूं - मैं वास्तव में ग्रिड से बाहर दो उप-वर्ग बना देता हूं: OwnGrid और EnemyGrid। वे मूल रूप से ग्रिड क्लास में निहित माउसलिस्टर विधियों को ओवरराइड करते थे। आपके द्वारा प्रस्तावित नई संरचना के साथ, मैं ग्रिड उप-वर्गों में इन तरीकों को कैसे ओवरराइड कर सकता हूं? –

+0

@AndrewMartin मुझे यकीन नहीं है कि मैं सही तरीके से समझता हूं, लेकिन यदि आप दोनों वर्गों में घटना को अलग-अलग संभालना चाहते हैं, तो आप केवल 'माउसक्लेटेड (माउसइवेंट ई, सेल सेल)' –

+0

'ओवरराइड कर सकते हैं' मैं इन तरीकों को कैसे ओवरराइड कर सकता हूं ग्रिड सबक्लास 'यह आसान काम नहीं है (क्योंकि किसी भी मुद्दे के बिना संभव है), आप JCOmponents पदानुक्रम में खो सकते हैं, नुकसान में से एक विरासत से आया है, [इसके बजाय संरचना का उपयोग करें] (http://www.javaworld.com/ jw-11-1998/jw-11-Techn.html.html – mKorbel

2
+0

आपके उत्तर के लिए धन्यवाद और दूसरी पोस्ट पर आपकी टिप्पणी। मैं रचना के साथ वास्तव में परिचित नहीं हूँ। मैंने सबक्लास के "विस्तार" भाग से छुटकारा पा लिया है और इसके बजाय "निजी ग्रिड ग्रिड = नया ग्रिड()" बनाया है - अब मैं इसे माउसलिस्टर्स आदि से कैसे जोड़ सकता हूं? –

+0

[एक और जेबटन और एक्शनलिस्टर देखें] (http://stackoverflow.com/a/9007348/714968), फिर जेबटन को जेपीनेल और एक्शनलिस्टर को केवल माउस लिस्टनर में बदलें, सामान्य और काम करने वाले कोड उदाहरण – mKorbel

+0

के लिए मैं putClientProperty का उपयोग करने का सुझाव दूंगा ग्रिड आधारित खेल उदा पहेली, सुडोकू, .... – mKorbel

1

सबसे स्पष्ट तरीका है अपने MouseListenerCell वर्ग पर ही ले जाने के लिए किया जाएगा।

दूसरा विकल्प मैं सोच सकता हूं कि java.awt.Container.getComponentAt(int, int) का उपयोग करना है।

+0

या स्विंगउटिलिटीज – mKorbel