2009-06-21 18 views
23

Domanda molto semplice ma non posso farlo. Ho 3 classi:accesso a una variabile da un'altra classe

DrawCircle classe

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 classe

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 classe

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(); 
    } 
} 

Una classe crea una cornice, l'altra disegna un cerchio e lo riempie con cerchi più piccoli. In DrawFrame ho impostato larghezza e altezza. In DrawCircle ho bisogno di accedere alla larghezza e all'altezza di DrawFrame. Come faccio a fare questo?

Ho provato a creare un oggetto e ho provato a utilizzare .getWidth e .getHeight ma non riesco a farlo funzionare. Ho bisogno di un codice specifico qui perché ho provato un sacco di cose ma non riesco a farlo funzionare. Sto dichiarando che larghezza e altezza sono errate in DrawFrame? Sto creando l'oggetto nel modo sbagliato in DrawCircle?

Inoltre, le variabili che uso in DrawCircle, dovrei averle nel costruttore o no?

+0

Hai provato a fare un oggetto di quale classe? – Tom

risposta

37

Si potrebbe fare le variabili campi pubblici:

public int width; 
    public int height; 

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

È quindi possibile accedere alle variabili in questo modo:

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

Una soluzione migliore, però, sarebbe quello di rendere le variabili campi privati ​​aggiungono due metodi di accesso alla classe, incapsulati nella classe DrawFrame:

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; 
    } 

allora si può ottenere la larghezza/altezza in questo modo:

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

vi consiglio caldamente di utilizzare quest'ultimo metodo.

+2

in secondo luogo il forte suggerimento sul secondo metodo (come molti altri, presumo, vedi: http://stackoverflow.com/questions/393001/do-any-other-developers-get-yelled-at-for-making -ogni-cosa-pubblico-chiuso) – akf

+0

Ciao, Grazie per il vostro aiuto. Ho provato qualcosa di simile prima. Ho seguito il tuo codice e ancora non riesco a farlo funzionare. Ci deve essere un problema da qualche altra parte. Hai qualche suggerimento. Il codice nell'OP funziona. La mia classe principale ha questo aspetto: import java.awt. *; import java.awt.event. *; import javax.swing. *; public class CircMain { \t void main (String [] args) public static \t { \t \t cornice JFrame = new stiratoio(); \t \t frame.mostrare(); \t} } È questo ciò che sta causando il problema? –

+0

Qual è il problema esattamente? – Peter

1

Ho provato a fare un oggetto e provato utilizzando .getWidth e .getHeight ma non può farlo funzionare.

thats perché non si impostano i campi larghezza e altezza in JFrame, ma li sta impostando su variabili locali. I campi altezza e la larghezza sono inhereted da ImageObserver

Fields inherited from interface java.awt.image.ImageObserver 
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH 

Vedi http://java.sun.com/javase/6/docs/api/javax/swing/JFrame.html

Se larghezza e altezza rappresentano lo stato del telaio, poi li poteva refactorize ai campi, e scrivere getter per loro.

Poi, si potrebbe creare un costruttore che riceve entrambi i valori come parametri

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 
} 

Se widht e l'altezza stanno per essere costante (dopo creati) quindi si dovrebbe utilizzare la finale modificatore di . In questo modo, una volta assegnato un valore, non possono essere modificati.

Inoltre, le variabili che uso in DrawCircle, dovrebbe li ho nel costruttore o no?

Il modo in cui è redigendi ora, solo consentirà di creare un tipo di cerchio. Se non vuoi creare cerchi diversi, dovresti sovraccaricare il costruttore con uno con argomenti).

Ad esempio, se si desidera modificare gli attributi Xpoint e yPoint, si potrebbe avere un costruttore

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

EDIT:

Where does _width and _height come from? 

Questi sono argomenti per i costruttori. Si impostano valori su di essi quando si chiama il metodo Constructor.

In DrawFrame ho impostato larghezza e altezza. In DrawCircle devo accedere alla larghezza e all'altezza di DrawFrame . Come faccio faccio questo?

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

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

    // other stuff 

} 

Ora, quando il costruttore DrawCircle esegue, riceverà i valori che hai usato nel stiratoio come _width e _height rispettivamente.

EDIT:

provare a fare

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

Thatnks per il vostro aiuto, e scuse per non averlo capito. Non riesco a farlo funzionare. Sfortunatamente non sto meglio che fossi 5 ore fa. Da dove vengono _width e _height? Pratico un sacco di modi diversi di fare, ma non c'è un modo specifico per farlo. –

+0

Ok, vedi la mia modifica. Penso che sia così! – Tom

+0

Ma cosa li passa nel costruttore? Ho assunto dal mio principale: public static void main (String [] args) { JFrame frame = new DrawFrame (400,400); frame.show(); } Ho provato questo e non ha funzionato. Essenzialmente sono ancora dove ero alle 9 di stamattina. Sospetto che le cose che mi stai dicendo non funzionino con l'altro codice che ho. Grazie per il vostro aiuto, lascerò l'apprendimento java un altro giorno. –

0

se quello che vi serve è la larghezza e l'altezza del telaio nel cerchio, perché non passa la larghezza stiratoio e l'altezza in Costruttore 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; 
} 

si potrebbe anche aggiungere un paio di nuovi metodi per DrawCircle:

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

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

o anche:

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

se si va su questa strada, è necessario aggiornare stiratoio per fare un var locale del DrawCircle su cui chiamare questi metodi.

edit:

quando si cambia il costruttore DrawCircle come descritto nella parte superiore del mio post, non dimenticate di aggiungere la larghezza e l'altezza per la chiamata al costruttore in stiratoio:

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

Ottengo errori dicendo "il costruttore DrawCircle non è definito" –

+0

johnrambo, il compilatore si stava probabilmente lamentando perché hai modificato i parametri nel costruttore ma non hai modificato la chiamata in DrawFrame che faceva ancora riferimento al costruttore no-arg. vedi la mia modifica, per favore. – akf

0

Spero di capire il problema correttamente, ma sembra che tu non abbia un riferimento all'oggetto DrawFrame di DrawCircle.

Prova questa:

modificare la firma di costruzione per DrawCircle a prendere in un oggetto stiratoio. All'interno del costruttore, imposta la variabile di classe "d" all'oggetto DrawFrame appena catturato. Ora aggiungi i metodi getWidth/getHeight a DrawFrame come menzionato nelle risposte precedenti. Vedi se questo ti permette di ottenere ciò che stai cercando.

tuo costruttore DrawCircle dovrebbe essere cambiato in qualcosa di simile:

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; 
} 

L'ultima riga di codice in stiratoio dovrebbe essere simile:

contentPane.add(new DrawCircle(this)); 

Poi, provare a utilizzare d.getheight(), d.getWidth() e così via all'interno di DrawCircle. Questo presuppone che tu abbia ancora quei metodi disponibili su DrawFrame per accedervi, ovviamente.

+0

Ciao, l'ho provato. Non riesco a farlo funzionare. Ho provato così tante cose diofferent è possibile che l'errore provenga da qualche altra parte. Penso che tu capisca il mio problema, ma mi permetta di chiarire: Ho impostato la larghezza e l'altezza in DrawFrame In DrawCircle devo essere in grado di accedere ai valori di larghezza e altezza. Nel mio codice sopra (che funziona) sto ripristinando manualmente nel costruttore piuttosto che ottenerlo da DrawFrame. Devo essere in grado di impostare la larghezza e l'altezza una sola volta. –

+0

Vedo, ho copiato esattamente il costruttore per DrawCircle e ho appena aggiunto il parametro e la prima riga. Alla luce del tuo commento, sembra che sarebbe anche necessario aggiungere: "w = d.getWidth(); h = d.getHeight();" al posto di "w = 400; h = 400;" –

3

Ho avuto lo stesso problema. Per modificare variabili da classi diverse, ho fatto in modo che estendessero la classe che dovevano modificare. Ho anche reso statiche le variabili della super classe in modo che possano essere modificate da qualsiasi cosa le erediti. Li ho anche protetti per una maggiore flessibilità.

Fonte: Cattive esperienze. Buone lezioni

0

Nome file = url.java

public class url { 

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

} 

se volete chiamare la variabile basta usare questo:

url.BASEURL + "il codice qui";

Problemi correlati