【问题标题】:Change variables in ChangeListener?更改 ChangeListener 中的变量?
【发布时间】:2017-12-14 02:54:08
【问题描述】:

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

这是一个例子:

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

        }
    });

【问题讨论】:

  • 根据您的操作,您可以使用两个ButtonGroups,这样可以确保每个组中只能选择一个按钮

标签: java swing changelistener


【解决方案1】:

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

你可以...

使计数器成为实例字段

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++;
            }
        });
   }
}

或者

根据您的操作,您可以使用两个ButtonGroups,这样可以确保每次只能选择每个组中的一个按钮

【讨论】:

    【解决方案2】:

    您可以更改变量的范围

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

    【讨论】:

    • 为什么?如何解决使用 OP 尝试从将侦听器添加到按钮的上下文中引用本地值的问题?
    • "我想要一个整数,当按钮的状态发生变化时它会增加。"我认为它是全球性的。 OP 没有说它是一个局部变量。
    • " 但它给了我一个错误,它说要使用最终或有效的最终"
    • 哦,我明白了。如果变量是本地的,它只会显示该错误。
    【解决方案3】:

    下面是一个示例,展示了在使用 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。只需更改 register(...) 方法来注册切换按钮。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多