当前位置: 首页 > 知识库问答 >
问题:

从ActionListener方法访问类变量

谷森
2023-03-14
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;
        }
   }

共有1个答案

方璞
2023-03-14

您在构造函数中声明了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书,发现了这一说法,类似这样。 方法本地类只能引用已标记的本地变量 在解释中,指定的原因与本地类对象和堆上的局部变量的范围和生存期有关,但我无法理解。我在这里想念任何东西吗? 问题答案: 原因是,在创建方法本地类实例时,编译器实际上会将其引用的所有方法本地变量复制到其中。这就是为什么只能访问变量的原因。甲变量或参考是不变的,所以它停留在同步与其方法本地