acessando uma variável de outra class

Pergunta muito simples, mas eu não posso fazer isso. Eu tenho 3 classs:

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

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

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

Uma class cria um quadro, o outro desenha um círculo e o preenche com círculos menores. No DrawFrame , defino largura e altura. Em DrawCircle , preciso acessar a largura e a altura do DrawFrame . Como eu faço isso?

Eu tentei criar um object e tentei usar o .getWidth e o .getHeight mas não consegui fazê-lo funcionar. Eu preciso de código específico aqui porque eu tentei muitas coisas, mas não consegui fazê-lo funcionar. Eu estou declarando largura e altura errada no DrawFrame ? Estou criando o object da maneira errada no DrawCircle ?

Além disso, as variables ​​que eu uso no DrawCircle , devo tê-los no construtor ou não?

Você poderia fazer as variables ​​campos públicos:

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

Você poderia então acessar as variables ​​da seguinte forma:

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

Uma solução melhor, no entanto, seria fazer com que as variables ​​private fields adicionem dois methods de access à sua class, mantendo os dados da class 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; } 

Então você pode obter a largura / altura da seguinte forma:

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

Eu sugiro fortemente que você use o último método.

Eu tive o mesmo problema. A fim de modificar variables ​​de classs diferentes, eu as fiz estender a class que elas deveriam modificar. Eu também tornei as variables ​​da class super estáticas para que elas possam ser alteradas por qualquer coisa que as herde. Eu também os fiz protegidos para mais flexibilidade.

Fonte: experiências ruins. Boas lições.

Eu tentei criar um object e tentei usar o .getWidth e o .getHeight, mas não consegui fazê-lo funcionar.

Isso porque você não está definindo os campos width e height no JFrame, mas os está definindo em variables ​​locais. Campos HEIGHT e WIDTH são herdados do ImageObserver

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

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

Se largura e altura representam o estado do quadro, você pode refatorizá-las para campos e escrever getters para eles.

Então, você poderia criar um Construtor que receba ambos os 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 } 

Se widht e height forem constantes (depois de criados), você deve usar o modificador final . Desta forma, uma vez que eles são atribuídos a um valor, eles não podem ser modificados.

Além disso, as variables ​​que eu uso no DrawCircle, devo tê-los no construtor ou não?

A maneira como é escrita agora, só permitirá que você crie um tipo de círculo . Se você quiser criar círculos diferentes, você deve sobrecarregar o construtor com um com argumentos).

Por exemplo, se você quiser alterar os atributos xPoint e yPoint, você pode ter um construtor

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

EDITAR:

 Where does _width and _height come from? 

Esses são argumentos para os construtores. Você define valores neles quando chama o método Construtor.

No DrawFrame, defino largura e altura. Em DrawCircle, preciso acessar a largura e a altura do DrawFrame. Como eu faço isso?

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

Agora, quando o construtor DrawCircle é executado, ele receberá os valores usados ​​em DrawFrame como _width e _height, respectivamente.

EDITAR:

Tente fazer

  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 que eu esteja entendendo o problema corretamente, mas parece que você não tem uma referência ao seu object DrawFrame de DrawCircle.

Tente isto:

Altere sua assinatura de construtor para DrawCircle para receber um object DrawFrame. Dentro do construtor, defina a variável de class “d” para o object DrawFrame que você acabou de include. Agora, adicione os methods getWidth / getHeight ao DrawFrame, conforme mencionado nas respostas anteriores. Veja se isso permite que você consiga o que está procurando.

Seu construtor DrawCircle deve ser alterado para 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; } 

A última linha de código no DrawFrame deve ser algo como:

 contentPane.add(new DrawCircle(this)); 

Em seguida, tente usar d.getheight (), d.getWidth () e assim por diante no DrawCircle. Isso pressupõe que você ainda tenha esses methods disponíveis no DrawFrame para acessá-los, é claro.

se o que você precisa é a largura e a altura do quadro no círculo, por que não passar a largura e a altura do DrawFrame para o construtor 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; } 

Você também pode adicionar alguns novos methods ao DrawCircle:

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

ou mesmo:

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

Se você percorrer esse caminho, precisará atualizar o DrawFrame para criar um var local do DrawCircle no qual chamar esses methods.

editar:

Ao alterar o construtor DrawCircle conforme descrito na parte superior do meu post, não se esqueça de adicionar a largura e a altura à chamada para o construtor no 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)); } } 

Nome do arquivo = url.java

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

Se vc quiser chamar a variavel, use isso:

url.BASEURL + “seu código aqui”;