关于类之间访问变量

「已注销」 2007-12-31 01:09:42
一个类要访问另一个类中的方法,除了把这个方法声明为静态方法外,还有其它办法吗?
比如有两个类CaptureScreen和DrawPanel,在CaptureScreen类中有个变量capture,类型是BufferedImage,
存放我所截的图。在DrawPanel类中有个paintComponent方法,DrawPanel继承于JPanel。
我想把capture在DrawPanel类中绘制出来。
要求:不能把paintComponent声明为静态方法;不能在CaptureScreen类中创建DrawPanel的对象,因为这样做的话,
我还要重新创建一个框架JFrame。
请问一下,有什么办法实现?
...全文
124 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2007-12-31
  • 打赏
  • 举报
回复
我试过了,传capture给Addcapture,但是在静态方法里不能调用repaint(),如果不用的话,还是会出现上面的问题,
就是运行之后,刚开始在画板里没有显示,当最小化再还原的话,会显示一个和截图大小的黑色方块。

public static void Addcapture(BufferedImage buff)
{
try
{
//System.out.println("asdsdaf");
//String s = "CaptureScreen";
//Class capture = Class.forName(s);
//Field field = capture.getField("capture");
//BufferedImage img = (BufferedImage) field.get(BarPanel.cs);
buffimage = new BufferedImage(buff.getWidth(),buff.getHeight(),BufferedImage.TYPE_INT_RGB);
buffgra = buffimage.createGraphics();
buffgra.drawImage(buffimage,0,0,null);
//repaint();
}
catch (Exception e)
{
e.printStackTrace();
}
网络咖啡 2007-12-31
  • 打赏
  • 举报
回复
参数传递
「已注销」 2007-12-31
  • 打赏
  • 举报
回复
capture不是静态的。
问题是我必须在CaptureScreen类里调用下面这个方法

public void Passcapture()
{
  if(capture != null)
  {
DrawPanel.Addcapture();
  }
}
下面这个方法是DrawPanel类里的,buffimage是静态的
public static void Addcapture()
{
try
{
String s = "CaptureScreen";
Class capture = Class.forName(s);
Field field = capture.getField("capture");
BufferedImage img = (BufferedImage) field.get(BarPanel.cs);//我在BarPanel创建了一个CaptureScreen的对象
buffimage = new BufferedImage(img.getWidth(),img.getHeight(),BufferedImage.TYPE_INT_RGB);
buffgra = buffimage.createGraphics();
buffgra.drawImage(buffimage,0,0,null);
}
 catch (Exception e)
{
e.printStackTrace();
}
}
运行之后,刚开始在画板里没有显示,当最小化再还原的话,会显示一个和截图大小的黑色方块。
请问为什么会这样?
daimojingdeyu 2007-12-31
  • 打赏
  • 举报
回复
参考一下下面的方法,可能会有点帮助
如果capture对象不是静态的,先要保证可以得到现有的CaptureScreen对象,否则就不需要啦
try {
Class capture = Class.forName(CaptureScreen的类名); //先找到类
// 找到变量,如果是私有的,可以结合getDeclaredField和setAccessible改变一下访问修饰控制权限再获取
Field field = capture.getField("capture");
// 获取对应的变量,如果CaptureScreen为静态类,get方法传入null既可
BufferedImage img = (BufferedImage) field.get(CaptureScreen的对象);
} catch (Exception ex) {
//do something
}
「已注销」 2007-12-31
  • 打赏
  • 举报
回复
最好不要创建CaptureScreen对象,牵涉很多代码,不方便。
请问就上面的例子用反射如何做?
「已注销」 2007-12-31
  • 打赏
  • 举报
回复
谢谢各位了,我的问题解决了,原来有个地方出了点小错误。
按这个方法运行是可以的。
public void Addcapture(BufferedImage buff)
{
buffimage = new BufferedImage(buff.getWidth(),buff.getHeight(),BufferedImage.TYPE_INT_RGB);//问题是不是出在这里?
buffgra = buffimage.createGraphics();
buffgra.drawImage(buff,0,0,null);
repaint();
}
daimojingdeyu 2007-12-31
  • 打赏
  • 举报
回复
可以用反射做。
「已注销」 2007-12-31
  • 打赏
  • 举报
回复
访问的问题解决了,我把DrawPanel类的一个实例传给CaptureScreen的构造函数,
这样就可以在这个方法里调用Addcapture方法了。

public void Passcapture()
{
  if(capture != null)
  {
     drawpaenl.Addcapture(caputre); //drawpanel是一个实例对象
  }
}
下面这个方法是DrawPanel类里面的
public void Addcapture(BufferedImage buff)
{
buffimage = new BufferedImage(buff.getWidth(),buff.getHeight(),BufferedImage.TYPE_INT_RGB);//问题是不是出在这里?
buffgra = buffimage.createGraphics();
buffgra.drawImage(buff,0,0,null);
repaint();
}
但是用drawImage画出来的却是一个和截图同样大小的黑色方块。这就怪了。
如果改成这样的话
public void Addcapture(BufferedImage buff)
{
  ImageIcon icon = new ImageIcon(buff);
JLabel label = new JLabel(icon);
add(label);
  repaint();
}
要把窗口最小化再还原才能看到所截的图。这说明buff图像是有内容的,但为什么还是会出现问题呢?
请教一下!谢谢
lyazure 2007-12-31
  • 打赏
  • 举报
回复
capture变量应该不是静态的吧,不是的话说明你要实例化一个CaptureScreen对象,把这个CaptureScreen对象传递给DrawPanel。也就是,你应该用CaptureScreen和DrawPanel类实例化(就是new )出CaptureScreen对象和DrawPanel对象,把CaptureScreen的引用传递给DrawPanel(可以在DrawPanel构造函数中传递,或者添加一个方法来设置):

class DrawPanel {
CaptureScreen captureScreen;

public void setCaptureScreen(CaptureScreen cs){
captureScreen = cs;
}

//其他方法
}

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧