使用ActionListeners避免全局变量

时间:2016-06-01 17:43:02

标签: java swing global-variables jbutton actionlistener

所以我正在开发一个GUI项目,遇到了一个小问题。我对全局变量一直很熟悉,所以我决定练习WITHOUT全局变量。这是我设计的一个简单的小项目。

基本上,我希望能够在其上创建一个带有JButton的JFrame,而在这个JButton上,会有一个数字。每次按下JButton时,数字都会增加1.简单,对吧?好吧,我意识到没有全局变量,我不知道该怎么做。这是删除了不必要位的代码。

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import javax.swing.JFrame;
import javax.swing.JButton;

public class SOQ
{

   public SOQ()
   {

      JFrame frame = new JFrame("SOQ");
      JButton button = new JButton("PRESS HERE");

      programLoop(frame, button);

   }

   public JFrame buildFrame(JFrame frame)
   {

          //unnecessary to include

      return frame;

   }

   public void programLoop(JFrame frame, JButton button)
   {

      int iteration = 1;

      frame = buildFrame(frame);
          //unnecessary to include


      button.addActionListener(
             new ActionListener()
             {

                public void actionPerformed(ActionEvent event)
                {

                   //iteration++; //this line returns an error saying the var should be final

                   if(iteration >= 5)
                   {

                      //this is what I want it to reach

                   }

                }

             }

             );

      frame.add(button);
      frame.pack();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);

   }

   public static void main(String[] args)
   {

      SOQ mbpps = new SOQ();

   }

}

现在,查看代码,您可以看到我犯了一个主要罪,您无法更改ActionListener内的值。所以我尝试了几种不同的方式。我试图用一个方法代替iteration++基本上将变量作为参数,但事实证明这是不可能的,因为新方法无法触及iteration,因为{{1} }是不同方法的本地方法,而不是全局方法。我甚至试图弄乱iteration并且可能在另一个类中实现它,或者在接口中扩展它,但是这些都没有解决。这是我必须使用全局变量的情况吗?因为我看不到任何其他办法。

1 个答案:

答案 0 :(得分:1)

以下是我的一些想法:

class MyRandomClass {
    int thisIsNotAGlobal;  //It's an instance variable.
    ...
    void someFoobarMethod(...) {
        JButton button = ...;
        Thingy someThingy = ...;

        button.addActionListener(
             new ActionListener()
             {
                public void actionPerformed(ActionEvent event)
                {
                    thisIsNotAGlobal++;
                    someThingy.methodWithSideEffects(...);
                }
             });
    }
}