Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ChangeListener中更改变量?_Java_Swing_Changelistener - Fatal编程技术网

Java 在ChangeListener中更改变量?

Java 在ChangeListener中更改变量?,java,swing,changelistener,Java,Swing,Changelistener,我正在制作一个匹配的卡片程序,我想确保用户只选择两张卡片。所以我制作了ChangeListener,在这些ChangeListener中,我希望有一个整数,当按钮的状态发生变化时,这个整数会增加。我曾尝试使用int,但它给了我一个错误,它说使用final或final。是否有某种方法可以在changelistener方法内部使用int 以下是一个例子: card1Button.addChangeListener(new ChangeListener() { public voi

我正在制作一个匹配的卡片程序,我想确保用户只选择两张卡片。所以我制作了ChangeListener,在这些ChangeListener中,我希望有一个整数,当按钮的状态发生变化时,这个整数会增加。我曾尝试使用int,但它给了我一个错误,它说使用final或final。是否有某种方法可以在changelistener方法内部使用int

以下是一个例子:

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

        }
    });

您可以更改变量的范围

    public class CardGame {
      private int x;

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

你有两个基本的选择来解决眼前的问题

你可以。。。 将计数器设为实例字段

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

    public MyAwesomeCardGame() {
        //...
        card1Button.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                counter++;
            }
        });
   }
}
你可以。。。 使
计数器
成为匿名类字段的实例

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

    public MyAwesomeCardGame() {
        //...
        card1Button.addChangeListener(new ChangeListener() {
            private int counter;
            public void stateChanged(ChangeEvent e) {
                counter++;
            }
        });
   }
}
或者
根据您所做的工作,您可以使用两个按钮组来代替,这将确保每次只能从每个组中选择一个按钮。下面是一个示例,演示了在使用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();
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
公共类CheckBoxGroup
{
私有集模型=新HashSet();
私有整数组大小;
公共CheckBoxGroup(int groupSize)
{
this.groupSize=groupSize;
}
公共无效寄存器(JCheckBox复选框)
{
ButtonModel groupModel=新组ButtonModel();
groupModel.setSelected(checkBox.getModel().isSelected());
复选框.setModel(groupModel);
}
私有类GroupButtonModel扩展了JToggleButton.ToggleButtonModel
{
@凌驾
已选择公共无效设置(已选择布尔值)
{
如果(!已选定)
{
模型。移除(此);
super.setSelected(选中);
返回;
}
//选中当前选中的复选框数
if(models.size()==groupSize)
{
System.out.println(“只能选择“+groupSize+”项”);
}
其他的
{
模型。添加(此);
super.setSelected(选中);
}
}
}
私有静态void createAndShowGUI()
{
JPanel面板=新的JPanel();
CheckBoxGroup=新的CheckBoxGroup(3);
对于(int i=0;i<10;i++)
{
JCheckBox checkBox=newjcheckbox(String.valueOf(i));
面板。添加(复选框);
组。注册(复选框);
}
JFrame=新JFrame(“复选框组”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。添加(面板);
frame.setLocationByPlatform(真);
frame.pack();
frame.setVisible(true);
}
公共静态void main(字符串[]args)
{
invokeLater(新的Runnable()
{
公开募捐
{
createAndShowGUI();
}
});
}
}
它向组件添加自定义模型,以在允许您选择其他组件之前检查当前选定组件的数量


它也适用于JToggleButton。只需将register(…)方法更改为register toggle button。

根据您的操作,您可以使用两个
ButtonGroup
s,这将确保每个组只能选择一个按钮为什么?它将如何解决OP试图引用一个本地值的问题,该值是在监听器添加到按钮的上下文中使用的?“我希望有一个整数,当按钮的状态发生变化时,该整数将增加。”我认为它是全局的。OP没有说它是一个局部变量,“但它给了我一个错误,它说使用一个最终或有效的最终”哦,我明白了。只有当变量是局部变量时,才会显示该错误。