2009-06-21 19 views
23

बहुत आसान सवाल है लेकिन मैं इसे नहीं कर सकता।किसी अन्य वर्ग से एक चर का उपयोग

DrawCircle वर्ग

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class DrawCircle extends JPanel 
{ 
    private int w, h, di, diBig, diSmall, maxRad, xSq, ySq, xPoint, yPoint; 
    public DrawFrame d; 

    public DrawCircle() 
    { 
     w = 400; 
     h = 400; 
     diBig = 300; 
     diSmall = 10; 
     maxRad = (diBig/2) - diSmall; 
     xSq = 50; 
     ySq = 50; 
     xPoint = 200; 
     yPoint = 200; 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.setColor(Color.blue); 
     g.drawOval(xSq, ySq, diBig, diBig); 

     for(int y=ySq; y<ySq+diBig; y=y+diSmall*2) 
     { 
      for(int x=xSq; x<w-xSq; x=x+diSmall) 
      { 
       if(Math.sqrt(Math.pow(yPoint-y,2) + Math.pow(xPoint-x, 2))<= maxRad) 
        { 
         g.drawOval(x, y, diSmall, diSmall); 
        }    
      } 
     } 

     for(int y=ySq+10; y<ySq+diBig; y=y+diSmall*2) 
     { 
      for(int x=xSq+5; x<w-xSq; x=x+diSmall) 
      { 
       if(Math.sqrt(Math.pow(yPoint-y,2) + Math.pow(xPoint-x, 2))<= maxRad) 
       { 
        g.drawOval(x, y, diSmall, diSmall); 
       } 
      } 
     } 
    } 
} 

DrawFrame वर्ग

public class DrawFrame extends JFrame 
{ 
    public DrawFrame() 
    { 
     int width = 400; 
     int height = 400; 

     setTitle("Frame"); 
     setSize(width, height); 

     addWindowListener(new WindowAdapter() 
     { 
      public void windowClosing(WindowEvent e) 
      { 
       System.exit(0); 
      } 
     }); 

     Container contentPane = getContentPane(); 
     contentPane.add(new DrawCircle()); 
    } 
} 

CircMain वर्ग

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class CircMain 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new DrawFrame(); 
     frame.show(); 
    } 
} 
: मैं 3 वर्गों है

एक वर्ग एक फ्रेम बनाता है, दूसरा एक सर्कल खींचता है और इसे छोटे सर्किलों से भर देता है। DrawFrame में मैंने चौड़ाई और ऊंचाई निर्धारित की है। DrawCircle में मुझे DrawFrame की चौड़ाई और ऊंचाई तक पहुंचने की आवश्यकता है। मैं यह कैसे करु?

मैंने ऑब्जेक्ट बनाने का प्रयास किया है और .getWidth और .getHeight का उपयोग करने का प्रयास किया है लेकिन यह काम पर नहीं जा सकता है। मुझे यहां विशिष्ट कोड की आवश्यकता है क्योंकि मैंने बहुत सी चीजों की कोशिश की है लेकिन इसे काम पर नहीं लाया जा सकता है। क्या मैं DrawFrame में चौड़ाई और ऊंचाई को गलत घोषित कर रहा हूं? क्या ऑब्जेक्ट को DrawCircle में गलत तरीके से बना रहा है?

इसके अलावा, मैं DrawCircle में उपयोग किए जाने वाले चर, क्या मुझे उन्हें निर्माता में होना चाहिए या नहीं?

+0

आपने किस वर्ग का उद्देश्य बनाने की कोशिश की है? – Tom

उत्तर

37

आप चर सार्वजनिक क्षेत्रों बना सकता है:

public int width; 
    public int height; 

    DrawFrame() { 
    this.width = 400; 
    this.height = 400; 
    } 

फिर आप तो जैसे चर पहुंच सकता है:

DrawFrame frame = new DrawFrame(); 
int theWidth = frame.width; 
int theHeight = frame.height; 

एक बेहतर समाधान है, तथापि, चर निजी क्षेत्रों को जोड़ने बनाने के लिए किया जाएगा ड्रॉफ्रेम क्लास में डेटा को रखकर, आपकी कक्षा में दो एक्सेसर विधियां:

private int width; 
private int height; 

DrawFrame() { 
    this.width = 400; 
    this.height = 400; 
} 

    public int getWidth() { 
    return this.width; 
    } 

    public int getHeight() { 
    return this.height; 
    } 

तो फिर तुम चौड़ाई/ऊंचाई इतनी तरह प्राप्त कर सकते हैं:

DrawFrame frame = new DrawFrame(); 
    int theWidth = frame.getWidth(); 
    int theHeight = frame.getHeight(); 

मैं दृढ़ता से आप बाद विधि का उपयोग करें सुझाव देते हैं।

+2

मैं बाद की विधि पर मजबूत सुझाव देता हूं (जैसा कि कई अन्य करते हैं, मुझे लगता है। देखें: http://stackoverflow.com/questions/393001/do-any-other-developers-get-yelled-at-for-making - हर चीज-सार्वजनिक-बंद) – akf

+0

हाय, आपकी सहायता के लिए धन्यवाद। मैंने पहले ऐसा कुछ करने की कोशिश की। मैंने आपके कोड का पालन किया और अभी भी इसे काम नहीं कर सकता। कहीं और समस्या होनी चाहिए। क्या तुम्हारे पास कोई सुझाव है। ओपी में कोड काम करता है। मेरा मुख्य वर्ग इस तरह दिखता है: आयात java.awt। *; आयात java.awt.event। *; आयात javax.swing। *; सार्वजनिक वर्ग CircMain { \t public static void (String [] args) \t { \t \t JFrame फ्रेम = नए DrawFrame(); \t \t फ्रेम।प्रदर्शन(); \t} } क्या यह समस्या पैदा कर रहा है? –

+0

वास्तव में समस्या क्या है? – Peter

1

मैं एक वस्तु बनाने की कोशिश की और .getWidth और .getHeight लेकिन का उपयोग कर इसे काम करने के लिए नहीं मिल सकता की कोशिश की गए हैं।

ऐसा इसलिए है क्योंकि आप JFrame में चौड़ाई और ऊंचाई फ़ील्ड सेट नहीं कर रहे हैं, लेकिन आप उन्हें स्थानीय चर पर सेट कर रहे हैं। फील्ड्स ऊंचाई और चौड़ाई ImageObserver

से inhereted रहे
Fields inherited from interface java.awt.image.ImageObserver 
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH 

देखें http://java.sun.com/javase/6/docs/api/javax/swing/JFrame.html

चौड़ाई और ऊंचाई फ्रेम के राज्य का प्रतिनिधित्व करते हैं, तो आप उन्हें खेतों में refactorize सकता है, और उनके लिए ही टिककर खेल लिखें।

उसके बाद, आप एक निर्माता है कि दोनों मूल्यों को प्राप्त करता है पैरामीटर

public class DrawFrame extends JFrame { 
private int width; 
private int height; 

DrawFrame(int _width, int _height){ 

    this.width = _width; 
    this.height = _height; 

    //other stuff here 
} 
public int getWidth(){} 
public int getHeight(){} 

//other methods 
} 

widht और ऊंचाई लगातार होने जा रहे हैं, तो (के बाद बनाए गए) के रूप में तो आप अंतिम संशोधक का उपयोग करना चाहिए बना सकते हैं। इस तरह, एक बार उन्हें एक मूल्य आवंटित करने के बाद, उन्हें संशोधित नहीं किया जा सकता है।

इसके अलावा, चर मैं DrawCircle में उपयोग करते हैं, मैं उन्हें निर्माता में है या नहीं होना चाहिए?

जिस तरह से यह अब लिखा है, केवल आप ही चक्र की एक प्रकार बनाने के लिए अनुमति देगा। यदि आप अलग-अलग मंडलियों को नहीं बनाना चाहते हैं, तो आपको कन्स्ट्रक्टर को तर्क के साथ एक से अधिक लोड करना चाहिए)।

Where does _width and _height come from? 

उन निर्माताओं के लिए तर्क हैं:

उदाहरण के लिए, आप विशेषताओं xPoint और yPoint को बदलना चाहते हैं, तो आप एक निर्माता

public DrawCircle(int _xpoint, int _ypoint){ 
    //build circle here. 
} 

संपादित हो सकता था। जब आप कन्स्ट्रक्टर विधि को कॉल करते हैं तो आप उन पर मूल्य निर्धारित करते हैं।

ड्राफ्रेम में मैंने चौड़ाई और ऊंचाई निर्धारित की है। DrawCircle में मुझे ड्रॉफ्रेम की चौड़ाई और ऊंचाई तक पहुंचने की आवश्यकता है। मैं यह कैसे करता हूं?

DrawFrame(){ 
    int width = 400; 
    int height =400; 

    /* 
    * call DrawCircle constructor 
    */ 
    content.pane(new DrawCircle(width,height)); 

    // other stuff 

} 

अब जब DrawCircle निर्माता कार्यान्वित करता है, यह मान आप क्रमशः _width और _height के रूप में प्रयोग किया जाता DrawFrame प्राप्त होगा।

संपादित करें:

करने का प्रयास करें

DrawFrame frame = new DrawFrame();//constructor contains code on previous edit. 
frame.setPreferredSize(new Dimension(400,400)); 

http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html

+0

आपकी मदद के लिए, और इसे प्राप्त करने के लिए क्षमा नहीं। मैं इसे काम नहीं कर सकता। दुर्भाग्य से मैं बेहतर नहीं हूं कि मैं 5 घंटे पहले था। _width और _height कहां से आते हैं? मैं करने के कई अलग-अलग तरीकों के बिट्स प्राप्त करने की तरह हूं, लेकिन ऐसा करने का कोई विशिष्ट तरीका नहीं है। –

+0

ठीक है, मेरा संपादन देखें। मुझे लगता है कि यह है! – Tom

+0

लेकिन क्या उन्हें निर्माता में पास करता है? मैंने अपने मुख्य से लिया: सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) { जेएफआरएएम फ्रेम = नया ड्राफ्रेम (400,400); फ्रेम.शो(); } मैंने कोशिश की और यह काम नहीं किया। अनिवार्य रूप से मैं अभी भी हूं जहां मैं सुबह 9 बजे था। मुझे संदेह है कि जो सामान आप मुझे बता रहे हैं वह मेरे दूसरे कोड के साथ काम नहीं करता है। आपकी मदद के लिए धन्यवाद, मैं एक और दिन जावा सीखना छोड़ दूंगा। –

0

तो क्या आप की जरूरत चौड़ाई और सर्कल में फ्रेम की ऊंचाई है, क्यों में DrawFrame चौड़ाई और ऊंचाई पारित नहीं DrawCircle कंस्ट्रक्टर:

public DrawCircle(int w, int h){ 
    this.w = w; 
    this.h = h; 
    diBig = 300; 
    diSmall = 10; 
    maxRad = (diBig/2) - diSmall; 
    xSq = 50; 
    ySq = 50; 
    xPoint = 200; 
    yPoint = 200; 
} 

आप भी कर सकते हैं DrawCircle के एक जोड़े को नए तरीके जोड़:

public void setWidth(int w) 
    this.w = w; 

public void setHeight(int h) 
    this.h = h; 

या यहाँ तक कि:

public void setDimension(Dimension d) { 
    w=d.width; 
    h=d.height; 
} 

यदि आप इस मार्ग नीचे जाना, आप जिस पर कॉल करने के लिए DrawCircle की एक स्थानीय वर बनाने के लिए DrawFrame अपडेट करनी होगी इन तरीकों से।

संपादित करें:

जब DrawCircle निर्माता अपनी पोस्ट के शीर्ष पर वर्णित के रूप में बदल रहा है, न DrawFrame में निर्माता के लिए कॉल करने के लिए चौड़ाई और ऊंचाई को जोड़ने के लिए भूल जाते हैं:

public class DrawFrame extends JFrame { 
public DrawFrame() { 
    int width = 400; 
    int height = 400; 

    setTitle("Frame"); 
    setSize(width, height); 

    addWindowListener(new WindowAdapter() 
    { 
      public void windowClosing(WindowEvent e) 
      { 
        System.exit(0); 
      } 
    }); 

    Container contentPane = getContentPane(); 
    //pass in the width and height to the DrawCircle contstructor 
    contentPane.add(new DrawCircle(width, height)); 
} 
} 
+0

मुझे यह कहते हुए त्रुटियां मिलती हैं कि "कन्स्ट्रक्टर ड्राक्रिकल को अपरिभाषित किया गया है" –

+0

जॉनब्रंबो, आपका कंपाइलर शायद शिकायत कर रहा था क्योंकि आपने पैरामीटर को कन्स्ट्रक्टर में बदल दिया था, लेकिन आपने ड्रॉफ्रेम में कॉल नहीं बदला था जो अभी भी नो-एर्ग कन्स्ट्रक्टर का संदर्भ दे रहा था। कृपया मेरा संपादन देखें। – akf

0

मुझे आशा है कि मैं समस्या को सही ढंग से समझ रहा हूं, लेकिन ऐसा लगता है कि आपके पास DrawCircle से आपके DrawFrame ऑब्जेक्ट का संदर्भ नहीं है।

इस प्रयास करें:

DrawCircle एक DrawFrame वस्तु में लेने के लिए

अपने निर्माता हस्ताक्षर बदलें। कन्स्ट्रक्टर के भीतर, क्लास वेरिएबल "डी" को आपके द्वारा अभी तक गए ड्राफ्रेम ऑब्जेक्ट पर सेट करें। अब पिछले उत्तरों में बताए गए ड्राफ्रेम को GetWidth/getHeight विधियों को जोड़ें। देखें कि क्या आपको वह चीज़ मिलती है जो आप ढूंढ रहे हैं।

public DrawCircle(DrawFrame frame) 
{ 
    d = frame; 
    w = 400; 
    h = 400; 
    diBig = 300; 
    diSmall = 10; 
    maxRad = (diBig/2) - diSmall; 
    xSq = 50; 
    ySq = 50; 
    xPoint = 200; 
    yPoint = 200; 
} 

DrawFrame में कोड की अंतिम पंक्ति कुछ ऐसा दिखाई देगा:

आपका DrawCircle निर्माता की तरह कुछ करने के लिए बदला जाना चाहिए

contentPane.add(new DrawCircle(this)); 

फिर, d.getheight उपयोग करने का प्रयास(), डी .getWidth() और इसी तरह DrawCircle के भीतर। यह मानता है कि आपके पास अभी भी उन तरीकों का उपयोग करने के लिए DrawFrame पर उपलब्ध विधियां हैं।

+0

हाय, कोशिश की। इसे काम करने के लिए नहीं मिल सकता है। मैंने इतनी सारी उदासीन चीजों की कोशिश की है कि यह संभव है कि त्रुटि कहीं और से हो। मुझे लगता है कि आप मेरी समस्या को समझते हैं, लेकिन बस मुझे स्पष्टीकरण दें: मैंने DrawFrame में चौड़ाई और ऊंचाई सेट की है DrawCircle में मुझे चौड़ाई और ऊंचाई के मानों तक पहुंचने में सक्षम होना चाहिए। उपरोक्त मेरे कोड में (जो काम करता है) मैं मैन्युअल रूप से इसे DrawFrame से प्राप्त करने के बजाय निर्माता में रीसेट कर रहा हूं। मुझे केवल एक बार चौड़ाई और ऊंचाई निर्धारित करने में सक्षम होना चाहिए। –

+0

मैं देखता हूं, मैंने आपके कन्स्ट्रक्टर को DrawCircle के लिए बिल्कुल कॉपी किया है और केवल पैरामीटर और पहली पंक्ति को जोड़ा है। आपकी टिप्पणी के प्रकाश में, ऐसा लगता है कि यह भी जोड़ना आवश्यक होगा: "w = d.getWidth(); h = d.getHeight();" "डब्ल्यू = 400; एच = 400;" के स्थान पर –

3

मुझे एक ही समस्या थी। विभिन्न वर्गों से चर को संशोधित करने के लिए, मैंने उन्हें उस वर्ग का विस्तार किया जिससे वे संशोधित किए गए थे। मैंने सुपर क्लास के वैरिएबल को स्थिर भी बनाया ताकि उन्हें विरासत में आने वाली किसी भी चीज से बदला जा सके। मैंने उन्हें अधिक लचीलापन के लिए भी संरक्षित किया।

स्रोत: खराब अनुभव। अच्छा सबक।

0

फ़ाइल नाम = url.java

public class url { 

    public static final String BASEURL = "http://192.168.1.122/"; 

} 

यदि u चर कॉल करना चाहते हैं तो बस इस का उपयोग करें:

url.BASEURL + "यहाँ अपने कोड";

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