2012-04-01 20 views
5

मैं जावा में नेटबीन्स आईडीई के साथ काम कर रहा हूं।जब मैं jpanel (जावा) पर क्लिक करता हूं तो फ़ंक्शन को कैसे कॉल करें?

मेरे पास एक जेपीनेल के साथ एक फॉर्म है। प्रत्येक जेपीनेल में एक ग्रिडलायआउट 3x3 होता है और प्रत्येक स्थान पर एक छवि का प्रतिनिधित्व होता है [0,1,2,3,4,5,6,7,8] (छवि बनाई गई है जो एक कस्टम क्लास का उपयोग करती है, न केवल फिटिंग एक प्रयोगशाला में छवि)।

जब मैं उपयोगकर्ता उन्हें क्लिक करता हूं तो पैनल में दो छवियों का आदान-प्रदान करने में सक्षम होना चाहता हूं (पहले क्लिक करें: कोई कार्रवाई नहीं, दूसरा क्लिक करें: जेपीनल घटक में लगाई गई दो छवियों को स्विच करें)।

मैं पहले से ही एक समारोह exchangeComponents बनाया है और एक परीक्षण कोड के साथ (जैसे:

exchangeComponents (0,8,jPanel1) 

इसे सही ढंग से आदान) position1 (1 पंक्ति, 1 स्तंभ में स्थित छवियों और position2 में (3 पंक्ति, 3 स्तंभ) ।

समारोह एक creted निम्नलिखित है:

public void exchangeComponents(int component1,int component2,JPanel jpanel){ 
    try{ 
    Component aux1 = jpanel.getComponent(component1); 
    Point aux1Loc = aux1.getLocation(); 
    Component aux2 = jpanel.getComponent(component2); 
    Point aux2Loc = aux2.getLocation(); 
    aux1.setLocation(aux2Loc); 
    aux2.setLocation(aux1Loc); 
    } 
    catch (java.lang.ArrayIndexOutOfBoundsException ex){ /* error! bad input to the function*/ 
     System.exit(1); 
    } 
} 

मुझे लगता है मैं एक घटना है कि समारोह exchangeComponents फोन() के लिए neeed जब उपयोगकर्ता ग jpanel1 पर छवियों में से एक पर चाटना लेकिन मुझे यह कैसे करना चाहिए? और यह जांचने के लिए कि उपयोगकर्ता ने कौन से घटक (छवियों) का चयन किया है? मैं सिर्फ इतना पता है कि जब मैं एक बटन बनाने के अगर उस पर एक क्लिक (आईडीई से) की तरह

private void button1ActionPerformed(java.awt.event.ActionEvent evt) { 
// some code.. 
} 

एक घटना बन जाता है और कोड मैं में भरने निष्पादित किया जाता है।

किसी भी संकेत के लिए अग्रिम धन्यवाद।

उत्तर

4

आप आप सभी JLabels या जो कुछ भी कंटेनर आप अपने चित्रों के लिए है, की तरह करने के लिए एक ही माउस श्रोता जोड़ने की जरूरत, तो पता लगा जो JLabel आप MouseEvent.getSource(); से क्लिक किया, इस

boolean hasclicked1=false; 
JLabel click1label=null; 

public void mouseClicked(MouseEvent me){ 
    if(!hasclicked1){ //clicked first pic 
    hasclicked1 = true; 
    click1label = (JLabel) me.getSource(); 
    } else { //clicked second pic 
    hasclicked1 = false; 
    exchangeComponents(click1label, (JLabel) me.getSource(), /*your jpanel here*/); 
    } 
    //now change exchangeComponents so it uses JLabels as parameters 
public void exchangeComponents(JLabel component1, JLabel component2, JPanel jpanel){ 
    try{ 
    Component aux1 = component1; 
    Point aux1Loc = aux1.getLocation(); 
    Component aux2 = component2; 
    Point aux2Loc = aux2.getLocation(); 
    aux1.setLocation(aux2Loc); 
    aux2.setLocation(aux1Loc); 
    } catch (java.lang.ArrayIndexOutOfBoundsException ex) { /* error! bad input to the function*/ 
    System.exit(1); 
    } 
} 

की तरह आप छवियों के लिए JLabels का उपयोग नहीं कर रहे हैं, तो हालांकि, कोड जो कुछ के साथ प्रयोग कर रहे हैं में JLabel की जगह ...

संपादित करें: क्षमा करें, मुझे नहीं लगता कि मैंने यह अस्पष्ट बनाया है, लेकिन विधि वर्ग के साथ आपकी कक्षा कॉम्पोनेंट्स को माउसलिस्टर को कार्यान्वित करना है। फिर, माउसक्लिड इवेंट में मैंने जो कोड दिया था उसे डाल दिया। अपनी कक्षा में चर hasclicked1 और click1label को शामिल करना सुनिश्चित करें। आपको इस तरह की कक्षा बनाएं

public class ComponentExchanger implements MouseListener { 
boolean hasclicked1=false; 
JLabel click1label=null; 
JPanel mainPanel; 
public ComponentExchanger(){ 
    //create JFrame, JPanel, etc. 
    JFrame f=new JFrame(); 
    //etc. 
    mainPanel=new JPanel(); 
    f.add(mainPanel); 
    //set layout of panel, etc. 
    for(int i=0;i<9;i++){ 
     JLabel l=new JLabel(/*label image here*/); 
     Point loc=new Point(/*coordinates here*/); 
     l.setLocation(loc); 
     mainPanel.add(l); 
     /*more code*/ 
     f.setVisible(true); 
    } 
} 

public static void main(String args[]){ 
    new ComponentExchanger(); 
} 


public void mouseClicked(MouseEvent me){ 
    if(!hasclicked1){ //clicked first pic 
    hasclicked1 = true; 
    click1label = (JLabel) me.getSource(); 
    } else { //clicked second pic 
    hasclicked1 = false; 
    exchangeComponents(click1label, (JLabel) me.getSource(), mainPanel); 
    } 
    //now change exchangeComponents so it uses JLabels as parameters 
public void exchangeComponents(JLabel component1, JLabel component2, JPanel jpanel){ 
    try{ 
    Component aux1 = component1; 
    Point aux1Loc = aux1.getLocation(); 
    Component aux2 = component2; 
    Point aux2Loc = aux2.getLocation(); 
    aux1.setLocation(aux2Loc); 
    aux2.setLocation(aux1Loc); 
    } catch (java.lang.ArrayIndexOutOfBoundsException ex) { /* error! bad input to the function*/ 
    System.exit(1); 
    } 
} 

//Also, you will need to include the other mouselistener implemented methods, just 
//leave them empty 
} 
+0

धन्यवाद। यह बहुत स्पष्ट है .. लेकिन img1.addMouseListener (यह) के साथ; मैं फॉर्म हेल्फ़्ट पास करता हूं और यह कहता है "त्रुटि: माउस लिस्टर की उम्मीद है"। तो क्या? – dragonmnl

+0

अच्छी तरह से, मैंने इसे किया (क्लास को कॉम्पोनेंट लागू करने वाले माउसलिस्टर बनाया) और img1.addMouseListener (नया घटक लिस्टनर()) का उपयोग कर किया। समस्या अब है .. मैंने प्रत्येक घटक के लिए श्रोता जोड़ा लेकिन जब मैं किसी भी घटक (छवि) पर क्लिक करता हूं तो ईवेंट – dragonmnl

+0

पर ट्रिगर नहीं होता है, मुझे नहीं लगता कि मैंने इसे बहुत स्पष्ट बना दिया है, लेकिन आपकी कक्षा को इसकी आवश्यकता है MouseListener को लागू करें, फिर आपको श्रोता को अपने प्रत्येक घटकों में जोड़ना होगा जिन्हें चारों ओर स्विच किया जा रहा है। @dragonml – DankMemes

1

सबसे पहले, तकनीकी होने के लिए विधियों कार्य नहीं करते हैं। कुछ तरीके हैं जो आप कर सकते हैं। आप actionListener के साथ आगे बढ़ सकते हैं, लेकिन फिर आपको शायद बटन या कुछ चाहिए। या आप माउसलिस्टर का उपयोग कर सकते हैं, और पैनल के किसी निश्चित क्षेत्र पर क्लिक का पता लगा सकते हैं। स्विचिंग एल्गोरिदम के लिए, शायद 2 छवियों की एक सरणी। एक चर है जो प्रत्येक क्लिक से बढ़ता है। जब चर 2 है, इसे वापस 0.

clicks++; //every time the mouse is clicked; clicks starts out at 0 
if(clicks == 2){ 
clicks = 0; //at the end of the listener method 
} 

करने के लिए पहली पर क्लिक करें क्योंकि उपयोगकर्ता एक बार क्लिक किया क्लिक किया छवि, पहली सरणी स्लॉट में चला जाता है रीसेट करता है।

clickImage = imageArray[clicks]; 

दूसरे क्लिक पर, दूसरी क्लिक की गई छवि दूसरी सरणी स्लॉट पर जाती है, क्योंकि 2 क्लिक का पता चला है। इस मामले में, आपकी एक्सचेंज कॉम्पोनेंट्स विधि श्रोता विधि के अंत में जाएगी, तर्कों के साथ छविअरे [1], imageArray [2],।

आप इसे इनट्स या जो कुछ भी लागू कर सकते हैं, केवल सरणी में मान को सहेजें और एक incrementing और रीसेटिंग चर का उपयोग करें।

img1.addMouseListener(this); 
img2.addMouseListener(this); 

आदि:

संबंधित मुद्दे

 संबंधित मुद्दे