在ChangeListener中更改变量?

时间:2017-12-14 02:54:08

标签: java swing changelistener

我正在制作匹配的卡片程序,我想确保用户只选择两张卡片。所以我已经创建了Changelisteners,并且在这些changelisteners中,我希望有一个整数,当按钮状态发生变化时,该整数会增加。我曾尝试使用int,但它给了我一个错误,它说使用最终或有效的final。有没有办法可以在changelistener方法中使用int。

以下是一个例子:

  card1Button.addChangeListener(new ChangeListener() {
        public void stateChanged(ChangeEvent e) {
      //int increases here

        }
    });

3 个答案:

答案 0 :(得分:0)

您可以更改变量的范围

    public class CardGame {
      private int x;

      public CardGame() {
          card1Button.addChangeListener(new ChangeListener() {
              public void stateChanged(ChangeEvent e) {
                  x++;
              }
          });
      }
    }

答案 1 :(得分:0)

您有两个基本选择来解决当前问题

你可以......

使计数器成为实例字段

public class MyAwesomeCardGame extends ... {
    private int counter;
    //...

    public MyAwesomeCardGame() {
        //...
        card1Button.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                counter++;
            }
        });
   }
}

你可以......

使counter成为匿名类的字段实例

public class MyAwesomeCardGame extends ... {
    //...

    public MyAwesomeCardGame() {
        //...
        card1Button.addChangeListener(new ChangeListener() {
            private int counter;
            public void stateChanged(ChangeEvent e) {
                counter++;
            }
        });
   }
}

替代地

根据您正在做的事情,您可以使用两个ButtonGroup代替,这样可以确保每次只能选择一个按钮

答案 2 :(得分:0)

以下是一个示例,说明如何在使用JCheckBox时执行此操作:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class CheckBoxGroup
{
    private Set<GroupButtonModel> models = new HashSet<GroupButtonModel>();
    private int groupSize;

    public CheckBoxGroup(int groupSize)
    {
        this.groupSize = groupSize;
    }

    public void register(JCheckBox checkBox)
    {
        ButtonModel groupModel = new GroupButtonModel();
        groupModel.setSelected ( checkBox.getModel().isSelected() );
        checkBox.setModel( groupModel );
    }


    private class GroupButtonModel extends JToggleButton.ToggleButtonModel
    {
        @Override
        public void setSelected(boolean selected)
        {
            if (!selected)
            {
                models.remove( this );
                super.setSelected( selected );
                return;
            }

            //  Check number of currently selected check boxes

            if (models.size() == groupSize)
            {
                System.out.println("Only " + groupSize + " items can be selected");
            }
            else
            {
                models.add( this );
                super.setSelected( selected );
            }

        }
    }

    private static void createAndShowGUI()
    {
        JPanel panel = new JPanel();
        CheckBoxGroup group = new CheckBoxGroup(3);

        for (int i = 0; i < 10; i++)
        {
            JCheckBox checkBox = new JCheckBox( String.valueOf(i) );
            panel.add( checkBox );
            group.register( checkBox );
        }

        JFrame frame = new JFrame("Check Box Group");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( panel );
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
}

它为组件添加了一个自定义模型,以便在您选择其他组件之前检查当前所选组件的数量。

它也适用于JToggleButton。只需更改寄存器(...)方法即可注册切换按钮。