Java Swing中的接口和NullPointerException

Java Swing中的接口和NullPointerException,java,swing,interface,nullpointerexception,actionlistener,Java,Swing,Interface,Nullpointerexception,Actionlistener,我正在使用JDBC开发与MySql连接的销售和采购库存系统。最初的应用程序是让JFrame中的JPanel与SalesForm一起输入发票、客户项目名称等,并使用表格显示输入的数据。现在我继续扩展这个应用程序,选择获取报告,它需要在JFrame中更改/滑动JPanel,所以我在主框架上使用CardLayout。 以前的结构是这样的: AppMain类->大型机使用BorderLayout扩展JFrame添加了JPanel SalesForm和JPanel表 新结构: AppMain类->大型机使

我正在使用JDBC开发与MySql连接的销售和采购库存系统。最初的应用程序是让JFrame中的JPanel与SalesForm一起输入发票、客户项目名称等,并使用表格显示输入的数据。现在我继续扩展这个应用程序,选择获取报告,它需要在JFrame中更改/滑动JPanel,所以我在主框架上使用CardLayout。 以前的结构是这样的: AppMain类->大型机使用BorderLayout扩展JFrame添加了JPanel SalesForm和JPanel表 新结构: AppMain类->大型机使用CarLayout扩展JFrame添加了JPanel Welcome->Welcome扩展了具有用于销售和报告的JButton的JPanel 单击sales按钮并进一步打开SalesPanel扩展了JPanel,添加了JPanel SalesForm和JPanel表

在更改此结构之前,一切正常,我使用接口SalesFormListenerSaleFormEvent eve,其中SaleFormEvent扩展了EventObject,用于将所有表单值传递到大型机,在大型机中调用控制器类,控制器类将值移动到模型。更改结构后,单击sales按钮会给出nullpointerexception接口变量示例代码如下所示

public class SalesForm extends JPanel{
   private SalesFormListener listener;
    ..........
      public SalesForm(){
       .....
       JButton sales = new JButton("Sales");
       ..........
       sale.addActionListener(new ActionListener() {    
            public void actionPerformed(ActionEvent arg0) {    
                double price = Double.parseDouble(itemPrice.getText());    
                double itemQuantity = Double.parseDouble(quantity.getText());    
                double itemSale = Double.parseDouble(totalPrice.getText());    
                double customerPayment = Double.parseDouble(payment.getText());    
                double discountCal = Double.parseDouble(discount.getText());    
                SaleFormEvent eve = new SaleFormEvent(sale, invoice.getText(), customerName.getText(), itemName.getText(), price, itemQuantity, discountCal, itemSale, customerPayment);    
                if (eve != null){    
                    listener.saleFormListener(eve);    
                }    
            }    
        });    
       .............
      }
  public void setSaleFormListener(SaleFormListener listener){
    this.listener = listener;
}
现在是扩展JFrame的MainFrame类

public class MainFrame extends JFrame{
.........    
private SalesForm salesForm = new SalesForm();
public MainFrame(){
    ........ 
    salesForm.setSaleFormListener(new SaleFormListener() {
                public void saleFormListener(SaleFormEvent eve) {

                }
            });
    .............
   }
最后是接口

public interface SaleFormListener {

    public void saleFormListener(SaleFormEvent eve);

}
我尝试将这个大型机工作转移到SalesPanel,它实际上显示SalesForm,并且工作正常。我很困惑为什么我不能在MainFrame.class中执行此操作。。。可能是因为SalesPanel现在显示SalesForm,而接口方法只能在第一个内容窗格调用,如SalesPanel Extendes JPanel。
我知道那个问题很长,但如果没有完整的描述,就不可能解释所有的情况和影响。我将完成它,并为其他初学者免费提供源代码和应用程序

请添加stacktrace并标记发生异常的行。听起来您有一个混合引用问题,即,您认为要添加到视图中的面板不是具有注册listenerException的面板。我正在调用接口类listener.saleFormListenereve的ActionListener中的SalesForm中发生异常。。。它的意思是没有注册的侦听器。我是初学者,明白了吗&