acceder a una variable de otra clase

Pregunta muy simple pero no puedo hacerlo. Tengo 3 clases:

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

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

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

Una clase crea un marco, la otra dibuja un círculo y lo llena con círculos más pequeños. En DrawFrame establezco ancho y alto. En DrawCircle necesito acceder al ancho y alto de DrawFrame . ¿Cómo hago esto?

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

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

Puede hacer que las variables sean campos públicos:

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

A continuación, puede acceder a las variables de esta manera:

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

Una mejor solución, sin embargo, sería hacer que las variables campos privados agreguen 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 puede obtener el ancho / alto como lo hace:

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

Le sugiero que use el último método.

Yo 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.

Intenté crear un objeto e intenté usar .getWidth y .getHeight, pero no puedo hacer que funcione.

Esto se debe a que no está configurando los campos de ancho y alto en JFrame, pero los está configurando en variables locales. Los campos HEIGHT y WIDTH se incluyen desde 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 el ancho y el alto representan el estado del marco, entonces podría refactorizarlos en campos y escribir getters para ellos.

Entonces, podrías crear un Constructor que reciba ambos 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 widht y height van a ser constantes (después de creados) entonces debes usar el modificador final . De esta forma, una vez que se les asigna un valor, no pueden modificarse.

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

La forma en que está escrito ahora, solo le permitirá crear un tipo de círculo . Si desea crear círculos diferentes, debe sobrecargar el constructor con uno con argumentos).

Por ejemplo, si quiere cambiar los atributos xPoint y yPoint, podría tener un constructor

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

EDITAR:

 Where does _width and _height come from? 

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

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

 DrawFrame(){ int width = 400; int height =400; /* * call DrawCircle constructor */ content.pane(new DrawCircle(width,height)); // other stuff } 

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

EDITAR:

Trata de hacerlo

  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

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

Prueba esto:

Cambie la firma de su constructor para DrawCircle para incluir 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 verse más o menos así:

 contentPane.add(new DrawCircle(this)); 

Luego, intente usar d.getheight (), d.getWidth () y demás en DrawCircle. Esto supone que todavía tienes esos métodos disponibles en DrawFrame para acceder a ellos, por supuesto.

si lo que necesita es el ancho y la altura del marco en el círculo, ¿por qué no pasar el ancho y la altura del DrawFrame al 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 agregar un par de métodos nuevos a 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 avanza por esta ruta, necesitará actualizar DrawFrame para hacer una var local de DrawCircle a la cual llamar a estos métodos.

editar:

Al cambiar el constructor DrawCircle como se describe en la parte superior de mi publicación, no te olvides de agregar el ancho y alto 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)); } } 

Nombre de archivo = url.java

 public class url { public static final String BASEURL = "http://192.168.1.122/"; } 

si quieres llamar a la variable simplemente usa esto:

url.BASEURL + “su código aquí”;