доступ к переменной из другого класса - PullRequest
27 голосов
/ 21 июня 2009

Очень простой вопрос, но я не могу этого сделать. У меня есть 3 класса:

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

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

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

Один класс создает рамку, другой рисует круг и заполняет его меньшими кругами. В DrawFrame я установил ширину и высоту. В DrawCircle мне нужно получить доступ к ширине и высоте DrawFrame. Как мне это сделать?

Я пытался создать объект и пытался использовать .getWidth и .getHeight, но не смог заставить его работать. Мне нужен конкретный код, потому что я много чего пробовал, но не могу заставить его работать. Я неправильно объявляю ширину и высоту в DrawFrame? Я неправильно создаю объект в DrawCircle?

Кроме того, переменные, которые я использую в DrawCircle, должны они быть в конструкторе или нет?

Ответы [ 6 ]

42 голосов
/ 21 июня 2009

Вы можете сделать переменные открытыми полями:

  public int width;
  public int height;

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

Затем вы можете получить доступ к переменным следующим образом:

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

Однако лучшим решением было бы сделать так, чтобы закрытые поля переменных добавляли в ваш класс два метода доступа, сохраняя данные в классе 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;
  }

Тогда вы можете получить ширину / высоту примерно так:

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

Я настоятельно рекомендую вам использовать последний метод.

4 голосов
/ 13 августа 2012

У меня была такая же проблема. Чтобы изменить переменные из разных классов, я заставил их расширить класс, который они должны были изменить. Я также сделал переменные суперкласса статическими, чтобы они могли быть изменены любым, что их наследует. Я также сделал их защищенными для большей гибкости.

Источник: Плохой опыт. Хорошие уроки.

1 голос
/ 21 июня 2009

Я пытался сделать объект и пытался используя .getWidth и .getHeight, но не могу заставить его работать.

Это потому, что вы не устанавливаете поля ширины и высоты в JFrame, но вы устанавливаете их для локальных переменных. Поля ВЫСОТА и ШИРИНА наследуются от ImageObserver

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

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

Если ширина и высота представляют состояние фрейма, то вы можете реорганизовать их в поля и написать для них геттеры.

Затем вы можете создать конструктор, который получит оба значения в качестве параметров

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
}

Если значение widht и высота будут постоянными (после создания), вам следует использовать модификатор final . Таким образом, если им присвоено значение, их нельзя изменить.

Кроме того, переменные, которые я использую в DrawCircle, я должен иметь их в конструктор или нет?

То, как оно написано сейчас, позволит вам создать один тип круга . Если вы не хотите создавать разные круги, вам следует перегрузить конструктор одним с аргументами).

Например, если вы хотите изменить атрибуты xPoint и yPoint, у вас может быть конструктор

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

РЕДАКТИРОВАТЬ:

Where does _width and _height come from?

Это аргументы для конструкторов. Вы устанавливаете значения для них при вызове метода Constructor.

В DrawFrame я устанавливаю ширину и высоту. В DrawCircle мне нужно получить доступ к ширина и высота DrawFrame. Как Я делаю это?

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

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

   // other stuff

}

Теперь, когда конструктор DrawCircle будет выполнен, он получит значения, которые вы использовали в DrawFrame, как _width и _height соответственно.

EDIT:

Попробуйте сделать

 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

0 голосов
/ 01 августа 2017

Filename = url.java

public class url {

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

}

если вы хотите вызвать переменную, просто используйте это:

url.BASEURL + "ваш код здесь";

0 голосов
/ 21 июня 2009

Надеюсь, я правильно понял проблему, но похоже, что у вас нет ссылки на ваш объект DrawFrame из DrawCircle.

Попробуйте это:

Измените свою подпись конструктора для DrawCircle, чтобы она принимала объект DrawFrame. В конструкторе установите переменную класса "d" для объекта DrawFrame, который вы только что приняли. Теперь добавьте методы getWidth / getHeight в DrawFrame, как упоминалось в предыдущих ответах. Посмотрите, позволит ли это получить то, что вы ищете.

Ваш конструктор DrawCircle должен быть изменен на что-то вроде:

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

Последняя строка кода в DrawFrame должна выглядеть примерно так:

contentPane.add(new DrawCircle(this));

Затем попробуйте использовать d.getheight (), d.getWidth () и т. Д. В DrawCircle. Это предполагает, что у вас все еще есть эти методы, доступные на DrawFrame, чтобы получить к ним доступ, конечно.

0 голосов
/ 21 июня 2009

, если вам нужны ширина и высота рамки в круге, почему бы не передать ширину и высоту DrawFrame в конструктор 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;
}

Вы также можете добавить пару новых методов в DrawCircle:

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

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

или даже:

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

если вы пойдете по этому маршруту, вам нужно будет обновить DrawFrame, чтобы создать локальную переменную DrawCircle, для которой нужно вызывать эти методы.

редактирование:

при изменении конструктора DrawCircle, как описано в начале моего поста, не забудьте добавить ширину и высоту к вызову конструктора в 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));
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...