web-dev-qa-db-fra.com

accéder à une variable d'une autre classe

Question très simple mais je ne peux pas le faire. J'ai 3 classes:

DrawCircle class

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 class

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 class

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

Une classe crée un cadre, l'autre dessine un cercle et le remplit de cercles plus petits. Dans DrawFrame je règle la largeur et la hauteur. Dans DrawCircle, je dois accéder à la largeur et à la hauteur de DrawFrame. Comment puis-je faire cela?

J'ai essayé de créer un objet et d'utiliser .getWidth et .getHeight, mais je ne parviens pas à le faire fonctionner. J'ai besoin de code spécifique ici car j'ai essayé beaucoup de choses mais je ne peux pas le faire fonctionner. Est-ce que je déclare la largeur et la hauteur incorrectes dans DrawFrame? Est-ce que créer l'objet dans le mauvais sens dans DrawCircle?

Aussi, les variables que j'utilise dans DrawCircle, devrais-je les avoir dans le constructeur ou pas?

24
johnrambo

Vous pouvez créer des champs publics de variables:

  public int width;
  public int height;

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

Vous pouvez alors accéder aux variables comme ceci:

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

Une meilleure solution, cependant, consisterait à faire en sorte que les champs privés des variables ajoutent deux méthodes d’accesseur à votre classe, en maintenant les données de la classe DrawFrame encapsulées:

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

Ensuite, vous pouvez obtenir la largeur/hauteur comme suit:

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

Je vous suggère fortement d'utiliser cette dernière méthode.

40
Peter

J'ai eu le même problème. Afin de modifier les variables de différentes classes, je leur ai demandé d'étendre la classe à modifier. J'ai également rendu les variables de la super classe statiques afin qu'elles puissent être modifiées par tout ce qui les hérite. Je les ai aussi protégés pour plus de flexibilité.

Source: Mauvaises expériences. Bonnes leçons.

4
LifesAway

J'ai essayé de faire un objet et essayé en utilisant .getWidth et .getHeight mais Je ne peux pas le faire fonctionner.

C'est parce que vous ne définissez pas les champs width et height dans JFrame, mais que vous les définissez sur des variables locales. Les champs HEIGHT et WIDTH sont hérités de ImageObserver.

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

Voir http://Java.Sun.com/javase/6/docs/api/javax/swing/JFrame.html

Si la largeur et la hauteur représentent l'état du cadre, vous pouvez les reformater en champs et leur attribuer des accesseurs.

Ensuite, vous pouvez créer un constructeur qui reçoit les deux valeurs en tant que paramètres.

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 et height doivent être constants (après création), vous devez utiliser le modificateur final. De cette façon, une fois qu’une valeur leur est assignée, elles ne peuvent plus être modifiées.

En outre, les variables que j'utilise dans DrawCircle, devrais-je les avoir dans le constructeur ou pas?

La façon dont il est écrit maintenant ne vous permettra que de créer un type de cercle. Si vous ne voulez pas créer de cercles différents, vous devez surcharger le constructeur avec un avec des arguments).

Par exemple, si vous souhaitez modifier les attributs xPoint et yPoint, vous pouvez avoir un constructeur.

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

MODIFIER: 

Where does _width and _height come from?

Ce sont des arguments aux constructeurs. Vous définissez des valeurs sur eux lorsque vous appelez la méthode Constructor.

Dans DrawFrame, je règle la largeur et la hauteur . Dans DrawCircle, je dois accéder à la largeur et hauteur de DrawFrame. Comment faire Je fais ça?

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

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

   // other stuff

}

Désormais, lorsque le constructeur DrawCircle s'exécutera, les valeurs que vous avez utilisées dans DrawFrame seront respectivement _width et _height.

MODIFIER:

Essayer de faire

 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

1
Tom

Nom de fichier = url.Java

public class url {

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

}

si vous voulez appeler la variable, utilisez ceci:

url.BASEURL + "votre code ici"; 

0
Marwan Salim

J'espère comprendre le problème correctement, mais il semblerait que vous n'ayez pas de référence à votre objet DrawFrame de DrawCircle.

Essaye ça:

Modifiez votre signature de constructeur pour DrawCircle afin d'intégrer un objet DrawFrame. Dans le constructeur, définissez la variable de classe "d" sur l'objet DrawFrame que vous venez d'entrer. Ajoutez maintenant les méthodes getWidth/getHeight à DrawFrame comme indiqué dans les réponses précédentes. Voyez si cela vous permet d’obtenir ce que vous cherchez.

Votre constructeur DrawCircle doit être changé en quelque chose comme:

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 dernière ligne de code dans DrawFrame devrait ressembler à ceci:

contentPane.add(new DrawCircle(this));

Ensuite, essayez d’utiliser d.getheight (), d.getWidth () et ainsi de suite dans DrawCircle. Cela suppose que vous ayez toujours ces méthodes disponibles sur DrawFrame pour y accéder, bien sûr.

0
Lloyd McFarlin

si vous avez besoin de la largeur et de la hauteur du cadre dans le cercle, pourquoi ne pas transmettre la largeur et la hauteur de DrawFrame au constructeur 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;
}

vous pouvez également ajouter quelques nouvelles méthodes à DrawCircle:

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

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

ou même:

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

si vous suivez cette route, vous devrez mettre à jour DrawFrame pour créer une variable locale de DrawCircle sur laquelle appeler ces méthodes.

modifier:

lors de la modification du constructeur DrawCircle comme décrit en haut de mon message, n'oubliez pas d'ajouter la largeur et la hauteur à l'appel du constructeur dans 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
akf