为什么不添加ActionListener(e-> {...});在收听私人空白时无法正常工作?

时间:2018-10-04 13:06:24

标签: java indexoutofboundsexception

我已经环顾了很长时间,但似乎找不到我要找的答案。 我曾经在BlueJ上班,但是我的新学校在使用IntelliJ,但并不是所有的工作方式都一样,就像我记得的那样。

我有一个private void tester(),我要放在testButton.addActionListener(e -> {tester();});里面。 当我启动程序时,我立即收到错误消息,但是程序仍然打开,但是当我单击按钮时,什么也没有发生,只是出现了很长的错误。 出现的第一个错误是:

  

线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:索引1超出长度1的范围       在FrameTest。(FrameTest.java:16)       在FrameTest.main(FrameTest.java:11)​​

然后,当我单击按钮时,出现此长错误:

  

线程“ AWT-EventQueue-0”中的异常java.lang.ArrayIndexOutOfBoundsException:索引1超出长度1的范围       在FrameTest.tester(FrameTest.java:30)       在FrameTest.lambda $ makeFrame $ 0(FrameTest.java:47)       在java.desktop / javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)       在java.desktop / javax.swing.AbstractButton $ Handler.actionPerformed(AbstractButton.java:2308)       在java.desktop / javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)       在java.desktop / javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)       在java.desktop / javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)       在java.desktop / java.awt.Component.processMouseEvent(Component.java:6632)       在java.desktop / javax.swing.JComponent.processMouseEvent(JComponent.java:3342)       在java.desktop / java.awt.Component.processEvent(Component.java:6397)       在java.desktop / java.awt.Container.processEvent(Container.java:2263)       在java.desktop / java.awt.Component.dispatchEventImpl(Component.java:5008)       在java.desktop / java.awt.Container.dispatchEventImpl(Container.java:2321)       在java.desktop / java.awt.Component.dispatchEvent(Component.java:4840)       在java.desktop / java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)       在java.desktop / java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)       在java.desktop / java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)       在java.desktop / java.awt.Container.dispatchEventImpl(Container.java:2307)       在java.desktop / java.awt.Window.dispatchEventImpl(Window.java:2772)       在java.desktop / java.awt.Component.dispatchEvent(Component.java:4840)       在java.desktop / java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)       在java.desktop / java.awt.EventQueue $ 4.run(EventQueue.java:721)       在java.desktop / java.awt.EventQueue $ 4.run(EventQueue.java:715)       在java.base / java.security.AccessController.doPrivileged(本机方法)       在java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)       在java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)       在java.desktop / java.awt.EventQueue $ 5.run(EventQueue.java:745)       在java.desktop / java.awt.EventQueue $ 5.run(EventQueue.java:743)       在java.base / java.security.AccessController.doPrivileged(本机方法)       在java.base / java.security.ProtectionDomain $ JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)       在java.desktop / java.awt.EventQueue.dispatchEvent(EventQueue.java:742)       在java.desktop / java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)       在java.desktop / java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)       在java.desktop / java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)       在java.desktop / java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)       在java.desktop / java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)       在java.desktop / java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

我不知道长错误是否有帮助,但想显示它们。

这是我的完整代码:

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;

public class FrameTest {
    private JFrame frame;
    private JLabel test;
    private String liste[] =  new String[1];
    private int number = 0;
    public static void main (String[] args){
        new FrameTest();
    }
    public FrameTest(){
        makeFrame();
        liste[0] = "[**********]";
        liste[1] = "[*********-]";  //line 16, which caused the exception 
        liste[2] = "[********--]";
        liste[3] = "[*******---]";
        liste[4] = "[******----]";
        liste[5] = "[*****-----]";
        liste[6] = "[****------]";
        liste[7] = "[***-------]";
        liste[8] = "[**--------]";
        liste[9] = "[*---------]";
        liste[10] = "[----------]";
    }

    private void tester(){
        number++;
        test.setText(liste[number]);
    }

    private void makeFrame(){
        frame = new JFrame("Test");
        JPanel contentPane = (JPanel)frame.getContentPane();
        contentPane.setBorder(new EmptyBorder(1, 60, 1, 60));

        contentPane.setLayout(new BorderLayout(12, 12));

        JPanel testPanel = new JPanel();
        testPanel.setLayout(new GridLayout(2, 1));

        test = new JLabel("[**********]");
        testPanel.add(test);

        JButton testButton = new JButton("Test");
        testButton.addActionListener(e -> {tester();});
        testPanel.add(testButton);

        contentPane.add(testPanel, BorderLayout.CENTER);

        frame.pack();

        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setLocation(d.width/2 - frame.getWidth()/2, d.height/2 - frame.getHeight()/2);
        frame.setVisible(true);
    }
}

2 个答案:

答案 0 :(得分:0)

将String数组的大小增加到适当的长度,例如在您的情况下:

    private String liste[] =  new String[11]; // can store eleven elements

为避免多次单击按钮(超过11次)后ArrayIndexOutOfBoundsException发出蜂鸣声,应在tester()方法中检查索引:

private void tester(){
    if(number<liste.length) {
        number++;
    }
    test.setText(liste[number]);  //if number is greater than liste.length this would lead to an ArrayIndexOutOfBoundsException!
}

答案 1 :(得分:-2)

Tester不是ActionListener,它是一个方法。

尝试

addActionlistener(        new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent ae) {
           //put code for what tester does here. 
            tester();
        }
    }