按钮ActionListener导致大量错误,我不知道为什么 - java

我目前正在开发一个显示书籍文字的程序。但是,我首先需要通过操作侦听器向滚动面板内部的面板添加按钮,以调用这些书本对象。但是,我用来添加这些按钮的ActionListener给了我一大堆错误,但我无法对其进行故障排除。

我注意到它说它们是一个空指针异常,但是,我认为我已将侦听器中使用的所有内容实例化并分配了某种值。

book是存储一本书所有文本信息的对象。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class LibraryPanel extends JPanel {

    private Library library;
    private BookButton bookButton;
    private JScrollPane jScrollPane;
    private JButton jButton;
    private JTextField fileName;
    private JPanel bookList;

    public LibraryPanel ()
    {
        library = new Library();
        JPanel libraryPanel = new JPanel();
        libraryPanel.setLayout(new BoxLayout(libraryPanel, BoxLayout.Y_AXIS));  
        JPanel bookBox = new JPanel();
        bookBox.setLayout(new BorderLayout());
        JPanel importBooks = new JPanel();
        fileName = new JTextField(4);
        jButton = new JButton("Load");

        jButton.addActionListener(new MyjButtonActionListener());
        JPanel bookList = new JPanel();
        bookList.setLayout(new BoxLayout(bookList, BoxLayout.Y_AXIS));  
        importBooks.add(fileName);
        importBooks.add(jButton);

        setLayout(new BorderLayout());
        jScrollPane = new JScrollPane(bookList);
        jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        bookBox.add(jScrollPane);
        libraryPanel.add(bookBox, BorderLayout.CENTER);
        libraryPanel.add(importBooks);
        add(libraryPanel);
    }
    private class MyjButtonActionListener implements ActionListener
    {

        @Override
        public void actionPerformed(ActionEvent e) {
            String something = fileName.getText();
            File file = new File(something);
            if(file.exists() && file.isFile())
            {
                library.loadLibraryFromCSV(something);
                for(int i = 0;i<library.getBooks().size(); i++)
                {
                    Book book = library.getBook(i);
                    bookButton = new BookButton(book);
                    bookList.add(bookButton);
                }
            }
            else
            {
                fileName.setText("Invalid File");
            }
        }
    } 
}

BookButton的代码

    public BookButton (Book book)
        {
            this.book = book;
            BookButtonListener clicked = new BookButtonListener();
            addActionListener(clicked);
            String buttonText;
            if (book.getTitle().length() >= 20)
            {
                buttonText = book.toString().substring(0,19);
            }
            else
                buttonText = book.getTitle();
            setToolTipText(buttonText);
        }

我调用了actionListener,但是它会导致大量错误。

    Results:


 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at LibraryPanel$MyjButtonActionListener.actionPerformed(LibraryPanel.java:61)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

参考方案

杜德
线

at LibraryPanel$MyjButtonActionListener.actionPerformed(LibraryPanel.java:86)

说第86行包含一个未实例化的对象。检查这一行,您将知道哪个对象“未被实例化”或返回了NULL。

java.awt.HeadlessException - java

JFileChooser chooser = new JFileChooser(); JDialog dialog=new JDialog(); dialog.setAlwaysOnTop(true); /*System.out.println("is always on top?"+dialog.isAlwaysOnTop());*/ …

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…