class ButtonPanel extends JPanel
{
//JButton makeBlue;
BufferedImage img;
ButtonPanel(BufferedImage x)
{
final JButton makeBlue = new JButton ("Make Blue");
img = x;
//int width, height;
setBackground(Color.RED);
int height = 0;
add(makeBlue);
ActionListener action =
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (e.getSource()== makeBlue)
{
//img = x;
height = img.getHeight();
// System.out.println(rgbvalue);
//System.out.println(width + " " + height);
setBackground(Color.GREEN);
repaint();
}
}
};
makeBlue.addActionListener(action);
}
}
ImageEditorDeluxe.java:184: error: local variable height is accessed from within inner class; needs to be declared final
height = img.getHeight();
我有另一个名为ProgramWindow的类,在这个类中,我将图像编辑器的所有不同JPanels添加到一个主JFrame,我认为这可能是我的问题所在,因为BufferedImage是空的。以下是ProgramWindow的代码:
class ProgramWindow extends JFrame
{
ProgramWindow()
{
ImagePanel ip = new ImagePanel();
ChooseFile cf = new ChooseFile();
ButtonPanel bp = new ButtonPanel(ip.getImg());
add(ip, BorderLayout.CENTER);
add(cf, BorderLayout.SOUTH);
add(bp, BorderLayout.WEST);
}
}
我已经得出结论,ProgramWindow中的ButtonPanel传递了一个空参数,但我不知道为什么会这样。我在ImagePanel类中有一个名为getImg的方法,我将它作为ButtonPanel的参数调用。下面是ImagePanel的代码:
class ImagePanel extends JPanel
{
BufferedImage img;
ImagePanel()
{
setBackground(Color.BLUE); //to test
final JButton button = new JButton ("Display picture");
add(button);
ActionListener action =
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==button)
{
try
{
img = ImageIO.read(ChooseFile.getFile());
}
catch(IOException f)
{
f.printStackTrace();
}
repaint();
}
}
};
button.addActionListener(action);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
if (img != null)
g.drawImage(img, 0, 0, this);
}
public void setImage(BufferedImage i)
{
img = i;
repaint();
}
public BufferedImage getImg()
{
return img;
}
}
您在构造函数中声明了height,因此它对构造函数是本地的。也许让它成为类的实例字段会更好。
public class ButtonPanel extends JPanel {
private BufferedImage img;
private int height;
话虽如此,既然可以通过调用img.getheight()
随时获得高度变量字段,为什么还要有高度变量字段呢?
编辑
您的第二个问题,一个我们还不能帮助您,是您的img变量持有一个空引用。对于您的新代码,这表明ip.getimg()
返回null
,但不要相信我的话,测试一下。将这行代码放入代码中:
System.out.println("is ip.getImg() returning null? " + (ip.getImg()));
问题内容: 我有这个课: 有什么方法可以使用自变量访问静态变量?我宁愿这样做,因为长名称不可读。 问题答案: 使用。这对新旧样式类均适用。
我有以下情况: 在执行代码时,输出为:5。 如何通过父类方法访问子类(B)变量(x)? 这是否可以在不重写print()方法的情况下完成(即在B中取消注释)? [这很重要,因为在重写时,我们将不得不再次重写print()方法的整个代码] 编辑过 进一步澄清:- 问题的动机是使用父类方法中的子类私有变量的值。这不需要更改父类私有变量的值来获得所需的结果 (感谢大家的时间和帮助)
我的子类是,我需要在我的超类中使用字段和。我知道如何在子类中使用超类变量,但我必须学会如何做相反的事情?谢谢。
我正在开发一个计算圆形和方形(类)面积的小练习java程序,该程序实现了surface(接口),它有一个名为area()的方法。我需要实现一个名为SumArea的类,该类有一个名为Calcrea()的通用方法,该方法接收Circle circ[]和Square Square[]数组,并执行面积计算 程序结构: - urface.java quare.java 圆圈java rea.java 我怀疑
问题内容: 我正在为一个项目做老虎机。我无法从中生成新的随机数。我可以在程序启动并进行设置时将数字随机化,但是它不能满足我的需求。它仅用于测试目的。 我在另一个Java文件中。一切正常,我只是无法弄清楚如何在占位符产生新的随机量,以及按钮被按下时。 我刚刚在大约3周前才开始真正编码。 请不要讨厌,这是我有史以来的第一个项目。 问题答案: 尝试做不会按照您的预期去做,这使您可以访问 相同的 实例变量
问题内容: 嗨,我正在浏览有关内部类的SCJP书,发现了这一说法,类似这样。 方法本地类只能引用已标记的本地变量 在解释中,指定的原因与本地类对象和堆上的局部变量的范围和生存期有关,但我无法理解。我在这里想念任何东西吗? 问题答案: 原因是,在创建方法本地类实例时,编译器实际上会将其引用的所有方法本地变量复制到其中。这就是为什么只能访问变量的原因。甲变量或参考是不变的,所以它停留在同步与其方法本地