accedere a una variabile da un’altra class

Domanda molto semplice ma non posso farlo. Ho 3 classi:

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

Una class 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 object 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’object nel modo sbagliato in DrawCircle ?

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

È ansible rendere le variabili campi pubblici:

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

Potresti quindi accedere alle variabili in questo modo:

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

Una soluzione migliore, tuttavia, sarebbe quella di rendere le variabili campi privati ​​aggiungere due metodi di accesso alla class, mantenendo incapsulati i dati nella class 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; } 

Quindi puoi ottenere la larghezza / altezza in questo modo:

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

Vi consiglio caldamente di usare il secondo metodo.

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

Fonte: esperienze negative. Buone lezioni

Ho provato a creare un object e ho provato a utilizzare .getWidth e .getHeight ma non riesco a farlo funzionare.

Questo perché non stai impostando i campi width e height in JFrame, ma li stai impostando su variabili locali. I campi HEIGHT e WIDTH sono ereditati 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 la larghezza e l’altezza rappresentano lo stato del fotogramma, è ansible ridefinirli in campi e scrivere getter per essi.

Quindi, è ansible 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 height saranno costanti (dopo la creazione), dovresti usare il modificatore finale . In questo modo, una volta assegnato un valore, non possono essere modificati.

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

Il modo in cui è scritto ora, ti permetterà solo 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. } 

MODIFICARE:

 Where does _width and _height come from? 

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

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?

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

Ora, quando viene eseguito il costruttore DrawCircle, riceverà i valori utilizzati in DrawFrame rispettivamente come _width e _height.

MODIFICARE:

Prova 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

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

Prova questo:

Cambiare la firma del costruttore per DrawCircle per prendere in un object DrawFrame. All’interno del costruttore, imposta la variabile di class “d” all’object 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.

Il 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 DrawFrame dovrebbe essere simile a:

 contentPane.add(new DrawCircle(this)); 

Quindi, 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.

se ciò di cui hai bisogno è la larghezza e l’altezza della cornice nel cerchio, perché non passare la larghezza e l’altezza DrawFrame nel 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; } 

potresti anche aggiungere un paio di nuovi metodi a 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 scende lungo questa rotta, è necessario aggiornare DrawFrame per creare una var locale del DrawCircle su cui chiamare questi metodi.

modificare:

quando si modifica il costruttore DrawCircle come descritto all’inizio del mio post, non dimenticare di aggiungere la larghezza e l’altezza alla chiamata al costruttore in 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 file = url.java

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

se vuoi chiamare la variabile usa solo questo:

url.BASEURL + “il tuo codice qui”;