2009-06-21 26 views
23

Pregunta muy simple pero no puedo hacerlo. Tengo 3 clases:accediendo a una variable de otra clase

DrawCircle clase

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 clase

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 clase

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 clase crea un marco, la otra dibuja un círculo y la llena con círculos más pequeños. En DrawFrame configuré ancho y alto. En DrawCircle necesito acceder al ancho y alto de DrawFrame. ¿Cómo hago esto?

He intentado hacer un objeto e intenté usar .getWidth y .getHeight pero no puedo hacerlo funcionar. Necesito un código específico aquí porque he intentado muchas cosas pero no puedo hacerlo funcionar. ¿Estoy declarando mal el ancho y el alto en DrawFrame? ¿Estoy creando el objeto de la manera incorrecta en DrawCircle?

Además, las variables que uso en DrawCircle, ¿debo tenerlas en el constructor o no?

+0

¿Has intentado hacer un objeto de qué clase? – Tom

Respuesta

37

Se podría hacer que las variables de los campos comunes:

public int width; 
    public int height; 

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

A continuación, puede acceder a las variables de este modo:

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

Una mejor solución, sin embargo, habría que hacer las variables campos privados se suman dos métodos de acceso a su clase, manteniendo los datos en la clase DrawFrame encapsulados:

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

entonces se puede obtener la anchura/altura de este modo:

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

le recomiendo encarecidamente que utiliza el último método.

+2

En segundo lugar, la fuerte sugerencia sobre el último método (como hacen muchos otros, supongo. Ver: http://stackoverflow.com/questions/393001/do-any-other-developers-get-yelled-at-for-making -every-thing-public-closed) – akf

+0

Hola, Gracias por su ayuda. Intenté algo como esto antes. Seguí tu código y sigo sin poder hacerlo funcionar. Debe haber un problema en otro lado. Tienes alguna sugerencia. El código en el OP funciona. Mi clase principal se ve así: import java.awt. *; import java.awt.event. *; import javax.swing. *; clase pública CircMain { \t principales (args String []) public static void \t { \t \t marco JFrame = new DrawFrame(); \t \t marco.espectáculo(); \t} } ¿Esto es lo que está causando el problema? –

+0

¿Cuál es el problema exactamente? – Peter

1

He intentado hacer un objeto y trató usando .getWidth y .getHeight pero no puede conseguir que funcione.

Eso es porque no está configurando los campos de ancho y alto en JFrame, pero los está configurando en variables locales. Los campos altura y la anchura se inhereted de ImageObserver

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

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

Si la anchura y la altura representan el estado de la estructura, entonces se podría refactorize a los campos, y escribe captadores para ellos.

Entonces, se podría crear un constructor que recibe tanto los valores como parámetros

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 
} 

Si Ancho y altura van a ser constante (después de creado), entonces debería usar la última modificador. De esta forma, una vez que se les asigna un valor, no pueden modificarse.

Además, las variables que utilizo en drawCircle, debo ellos tienen en el constructor o no?

La forma en que se writen ahora, sólo se permitirá crear un tipo de círculo. Si desea crear círculos diferentes, debe sobrecargar el constructor con uno con argumentos).

Por ejemplo, si desea cambiar los atributos XPoint y yPoint, que podría tener un constructor

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

EDIT:

Where does _width and _height come from? 

Esos son argumentos a los constructores. Estableces valores cuando llamas al método Constructor.

En DrawFrame establezco el ancho y el alto. En DrawCircle necesito acceder al ancho y alto de DrawFrame. ¿Cómo hago que hago esto?

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

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

    // other stuff 

} 

Ahora, cuando el constructor drawCircle se ejecuta, recibirá los valores que utilizó en DrawFrame como _width y _height respectivamente.

EDIT:

Intente realizar

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 por su ayuda y disculpas por no conseguirlo. No puedo conseguir que funcione. Lamentablemente, no estoy mejor que hace 5 horas. ¿De dónde vienen _width y _height? De alguna manera estoy recibiendo diferentes formas de hacerlo, pero no hay una manera específica de hacerlo. –

+0

Ok, mira mi edición. ¡Creo que es eso! – Tom

+0

Pero, ¿qué los pasa al constructor? Supuse desde mi principal: public static void main (String [] args) { JFrame frame = new DrawFrame (400,400); frame.show(); } Intenté esto y no funcionó. Esencialmente, todavía estoy donde estaba a las 9 de la mañana. Sospecho que las cosas que me estás diciendo no funcionan con el otro código que tengo. Gracias por su ayuda, voy a dejar de aprender Java hasta otro día. –

0

si lo que necesita es la anchura y la altura del marco en el círculo, ¿por qué no pasa el ancho DrawFrame y altura en el Constructor 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; 
} 

también podría añadir un par de nuevos métodos para drawCircle:

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

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

o incluso:

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

si vas por este camino, tendrá que actualizar DrawFrame hacer una var local de la drawCircle en la que llamar estos métodos.

edición:

cuando se cambia el constructor drawCircle como se describe en la parte superior de mi post, no se olvide de añadir el ancho y la altura a la llamada al constructor en 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

Recibo errores que dicen "el constructor DrawCircle no está definido" –

+0

johnrambo, probablemente tu compilador se quejaba porque cambiaste los parámetros al constructor pero no cambiaste la llamada en DrawFrame que todavía hacía referencia al constructor no-arg. ver mi edición, por favor. – akf

0

Espero comprender el problema correctamente, pero parece que no tienes una referencia de tu objeto DrawFrame de DrawCircle.

Prueba esto:

modificar la firma constructora para drawCircle a tomar en un objeto DrawFrame. Dentro del constructor, establezca la variable de clase "d" en el objeto DrawFrame que acaba de incorporar. Ahora agregue los métodos getWidth/getHeight a DrawFrame como se menciona en las respuestas anteriores. Vea si eso le permite obtener lo que está buscando.

Su constructor drawCircle debería cambiarse a algo como:

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

La última línea de código en DrawFrame debería ser algo como:

contentPane.add(new DrawCircle(this)); 

Luego, trate de usar d.getheight(), d.getWidth() y así sucesivamente dentro de DrawCircle. Esto supone que todavía tienes esos métodos disponibles en DrawFrame para acceder a ellos, por supuesto.

+0

Hola, lo intenté. No puedo hacer que funcione. He intentado tantas cosas diferentes que es posible que el error sea de otro lado. Creo que entiendes mi problema, pero déjame aclarar: Configuré el ancho y alto en DrawFrame En DrawCircle necesito poder acceder a los valores de ancho y alto. En mi código anterior (que funciona) estoy restableciendo manualmente en el constructor en lugar de obtenerlo desde DrawFrame. Necesito poder establecer el ancho y la altura una sola vez. –

+0

Veo, copié tu constructor para DrawCircle exactamente y acabo de agregar el parámetro y la primera línea. A la luz de su comentario, parece que también sería necesario agregar: "w = d.getWidth(); h = d.getHeight();" en lugar de "w = 400; h = 400;" –

3

Tuve el mismo problema. Para modificar variables de diferentes clases, les hice extender la clase que debían modificar. También hice estáticas las variables de la superclase para que puedan ser cambiadas por cualquier cosa que las herede. También los hice protegidos para una mayor flexibilidad.

Fuente: malas experiencias. Buenas lecciones.

0

Nombre = url.java

public class url { 

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

} 

si quieres llamar a la variable sólo tiene que utilizar esto:

url.BASEURL + "aquí el código";

Cuestiones relacionadas