【问题标题】:Arrayindex out of bounds when using Actionlistener [duplicate]使用 Actionlistener 时 Arrayindex 超出范围 [重复]
【发布时间】:2021-11-12 04:26:27
【问题描述】:

我正在尝试制作我的第一个 tik tak toe 游戏,但是我遇到了一个问题,我解决了一些麻烦。当我尝试按下任何按钮而不是禁用该按钮时,它会说一些沿着 Arrayindex 的行超出索引 9 考虑到 Actionlistener 只能使用 9 次,而变量 i 从 0 开始并在每次循环时加 1,我认为这很奇怪。

线程“AWT-EventQueue-0”java.lang.ArrayIndexOutOfBoundsException 中的异常:索引 9 超出长度 9 的范围

在 Fenster.lambda$0(Fenster.java:38)

    import java.awt.Color;
    import java.awt.LayoutManager;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    
    public class Fenster extends JFrame implements ActionListener{
    
    
        private JButton knapp1 = new JButton();
        private JButton knapp2 = new JButton();
        private JButton knapp3 = new JButton();
        private JButton knapp4 = new JButton();
        private JButton knapp5 = new JButton();
        private JButton knapp6 = new JButton();
        private JButton knapp7 = new JButton();
        private JButton knapp8 = new JButton();
        private JButton knapp9 = new JButton();
        
        private JButton knappar[] = {knapp1, knapp2, knapp3, knapp4, knapp5, knapp6, knapp7, knapp8, knapp9};
    
        private int i = 0;
        private int h = 10;
        private int b = 10;
    
        Fenster(){
        
                
            while(i <= 8) {
            
            knappar[i].setBounds(b, h, 100, 100);
            knappar[i].setLayout(null);
            knappar[i].addActionListener(e -> knappar[i].setEnabled(false));
            knappar[i].setBackground(Color.green);
            this.add(knappar[i]);
            
            if (i%2 == 0) {
            }
            
            b = b+110;
                
            if(b > 230) {
                b = 10;
                h =h+110;
            }
            i++;
    //      System.out.println(i);1
            }
                    
            JPanel brada = new JPanel();
            
            brada.setLayout(null);
            brada.setSize(340, 340);
            brada.setBackground(Color.black);
            
    
            this.add(brada);
            this.setLayout(null);
            this.setVisible(true);
            this.setSize(340, 440);
            this.setResizable(false);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {    
        }   
    }

【问题讨论】:

  • 这和你的 ActionListener 一点关系都没有

标签: java swing jbutton actionlistener indexoutofboundsexception


【解决方案1】:

i 的值为 9 时,您的 while 循环结束。因此,当您的操作侦听器稍后运行 e -&gt; knappar[i].setEnabled(false) 时,它正在尝试访问 knapper[9]。您的 i 不应该是一个字段,并且您不应该尝试在动作侦听器中使用循环变量 i

相反,您可以为需要引用的对象设置另一个变量并使用它:

while (i <= 8) {
    final JButton btn = knapper[i];
    btn.setBounds(b, h, 100, 100);
    btn.setLayout(null);
    btn.addActionListener(e -> btn.setEnabled(false));
    btn.setBackground(Color.green);
    this.add(btn);
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-28
    • 2012-08-24
    • 2020-04-21
    • 2021-03-28
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多