从另一个类访问一个variables

非常简单的问题,但我不能做到这一点。 我有3个class级:

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

一个class级创build一个框架,另一个绘制一个圆圈,并填充小圆圈。 在DrawFrame我设置了宽度和高度。 在DrawCircle我需要访问DrawFrame的宽度和高度。 我如何做到这一点?

我试图做一个对象,并尝试使用.getWidth.getHeight但不能得到它的工作。 我在这里需要特定的代码,因为我已经尝试了很多东西,但不能得到它的工作。 我在DrawFrame声明宽度和高度是错误的吗? 在DrawCircle创build对象的方式是错误的吗?

另外,我在DrawCircle使用的variables,是否应该在构造函数中使用它们?

你可以使variables的公共字段:

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

然后你可以像这样访问variables:

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

然而,更好的解决scheme是使variables专用字段为您的类添加两个访问器方法,将数据保留在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(); 

我强烈build议你使用后一种方法。

我有同样的问题。 为了修改不同类的variables,我让它们扩展了要修改的类。 我也使超类的variables是静态的,所以它们可以被任何inheritance它们的东西所改变。 我也让他们保护更多的灵活性。

来源:不好的经验。 良好的教训。

我试图做一个对象,并尝试使用.getWidth和.getHeight,但不能得到它的工作。

这是因为您没有在JFrame中设置宽度和高度字段,而是将它们设置为局部variables。 ImageObserver中embedded了字段HEIGHT和WIDTH

 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

如果width和height表示框架的状态,那么你可以将它们重构为字段,并为它们写getters。

然后,您可以创build一个构造函数来接收两个值作为参数

 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将会是恒定的(在创build之后),那么你应该使用final修饰符。 这样,一旦赋值,就不能修改。

另外,我在DrawCircle中使用的variables,是否应该在构造函数中使用它们?

现在写的方式,只会让你创build一种types的圈子 。 如果你不想创build不同的圈子,你应该用带有参数的构造函数重载)。

例如,如果你想改变属性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。

编辑:

试着做

  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

我希望我正确地理解了这个问题,但看起来你没有从DrawCircle引用回你的DrawFrame对象。

尝试这个:

修改DrawCircle的构造函数签名以获取DrawFrame对象。 在构造函数中,将类variables“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)); 

然后,在DrawCircle中尝试使用d.getheight(),d.getWidth()等。 这里假设你仍然有DrawFrame上的这些方法来访问它们。

如果你需要的是圆的框架的宽度和高度,为什么不把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来创build一个调用这些方法的DrawCircle的局部variables。

编辑:

当更改我的post顶部所述的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)); } } 

文件名= url.java

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

如果你想调用variables只是使用这个:

url.BASEURL +“你的代码在这里”;