Подтвердить что ты не робот

Доступ к переменной из другого класса

Очень простой вопрос, но я не могу этого сделать. У меня есть 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, должны ли я иметь их в конструкторе или нет?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

Это потому, что вы не устанавливаете поля ширины и высоты в JFrame, но вы устанавливаете их на локальные переменные. Поля HEIGHT и WIDTH выводятся из 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 и height будут постоянными (после создания), вы должны использовать модификатор final. Таким образом, после присвоения значения они не могут быть изменены.

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

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

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

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

ИЗМЕНИТЬ:

Where does _width and _height come from?

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

В 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

Ответ 4

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

Ответ 5

Надеюсь, что я правильно понял проблему, но похоже, что у вас нет ссылки на объект 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 для доступа к ним, конечно.

Ответ 6

Имя файла = url.java

public class url {

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

}

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

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