l'accès à une variable d'une autre classe

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

DrawCircle classe

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 classe

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 classe

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 plus petits cercles. DrawFrame j'ai défini la largeur et la hauteur. DrawCircle j'ai besoin d'accéder à la largeur et la hauteur de DrawFrame. Comment dois-je faire cette?

j'ai essayé de faire un objet et essayé d'utiliser .getWidth et .getHeight mais ne peut pas le faire fonctionner. J'ai besoin d'un code spécifique ici parce que j'ai essayé beaucoup de choses mais je ne peux pas le faire fonctionner. Est-ce que je déclare largeur et hauteur erronées en

6 ответов

vous pouvez rendre les champs variables publics:

  public int width;
  public int height;

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

vous pouvez alors accéder aux variables comme so:

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

une meilleure solution, cependant, serait de faire les variables private fields ajouter deux méthodes d'accesseur à votre classe, en gardant les données dans la classe DrawFrame encapsulé:

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

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

39
répondu Peter 2013-10-10 00:32:22
la source

j'ai eu le même problème. Afin de modifier les variables de différentes classes, je leur ai fait étendre la classe qu'ils devaient modifier. J'ai aussi rendu les variables de la classe super statiques pour 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. De bonnes leçons.

3
répondu LifesAway 2012-10-06 00:57:32
la source

j'ai essayé de faire un objet et essayé utiliser. getWidth and .getHeight but pouvez pas le faire fonctionner.

C'est parce que vous ne définissez pas les champs Largeur et hauteur dans JFrame, mais vous les définissez sur les variables locales. La hauteur et la largeur des champs sont héritées 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, ensuite, vous pourriez les recadrer en champs, et écrire getters pour eux.

ensuite, vous pouvez créer un constructeur qui reçoit les deux valeurs comme 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 vont être constants (après created) alors vous devez utiliser le final modificateur. Ainsi, une fois qu'une valeur leur est attribuée, elles ne peuvent pas être modifiées.

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

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

par exemple, si vous voulez changer les attributs xPoint et yPoint, vous pouvez avoir un constructeur

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

EDIT:

Where does _width and _height come from?

ce sont des arguments pour les constructeurs. Vous définissez les valeurs sur eux lorsque vous appelez le Constructeur méthode.

dans DrawFrame je fixe la largeur et la hauteur. Dans DrawCircle j'ai besoin d'accéder à la largeur et hauteur du cadre. Comment faire - Je faire cela?

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

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

   // other stuff

}

lorsque le constructeur DrawCircle s'exécute, il reçoit les valeurs que vous avez utilisées dans DrawFrame comme _width et _height respectivement.

EDIT:

Essayer 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
répondu Tom 2009-06-21 10:56:26
la source

j'espère que je comprends le problème correctement, mais il semble que vous n'avez pas une référence en arrière à votre objet DrawFrame de DrawCircle.

essaye ceci:

modifiez votre signature de constructeur pour DrawCircle afin de prendre en compte un objet DrawFrame. Dans le constructeur, définissez la variable de classe "d" à l'objet DrawFrame que vous venez de saisir. Maintenant, ajoutez les méthodes getWidth/getHeight à DrawFrame comme mentionné dans les réponses précédentes. Vois si ça te permet d'avoir ce que tu es. à la recherche pour.

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 à quelque chose comme:

contentPane.add(new DrawCircle(this));

alors, essayez d'utiliser D. getheight (), D. getWidth () et ainsi de suite dans DrawCircle. Cela suppose que vous avez encore ces méthodes disponibles sur Étirage pour y accéder, bien sûr.

0
répondu Lloyd McFarlin 2009-06-21 09:30:08
la source

si vous avez besoin de la largeur et de la hauteur du cadre dans le cercle, pourquoi ne pas passer la largeur et la hauteur du cadre dans le 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 aussi ajouter quelques nouvelles méthodes pour DrawCircle:

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

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

ou encore:

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

si vous suivez cette route, vous devrez mettre à jour DrawFrame pour faire un var local du DrawCircle sur lequel appeler ces méthodes.

edit:

quand changer le constructeur DrawCircle comme décrit en haut de mon post, n'oubliez pas d'ajouter la largeur et la hauteur à l'appel au 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
répondu akf 2009-06-21 22:22:54
la source

nom du fichier = url.java

public class url {

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

}

si tu veux appeler la variable d'utiliser seulement ceci:

url.BASEURL + "votre code ici";

0
répondu Marwan Salim 2017-08-01 15:05:09
la source

Autres questions sur