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