【问题标题】:Java: Filling a JComboBox with objectsJava:用对象填充 JComboBox
【发布时间】:2012-10-03 03:26:11
【问题描述】:

我正在尝试用对象填充 jComboBox。我让它在一堂课上工作,但在这堂课中,它给出了NullPointerException,但代码几乎相同。我在这里错过了什么?

我用来填充组合框的代码:

我已将每个变量都翻译成英文并删除了一些不必要的内容。我希望你们现在更清楚了:

package unive.billing.boundary.clientmanager.frames;

import unive.billing.control.ClientsManager;
import unive.billing.control.InsuranceManager;

/**
 *
 * @author Forza
 */

public class ClientFrame extends javax.swing.JFrame {

/**
 * Creates new form AddClientGUI
 */
private ClientsManager clientmanager;
private InsuranceManager insurancemanager;

public ClientFrame() {
    initComponents();
    clientmanager = new ClientsManager();
    clientmanager.printList();
    updateComboBoxCompany();
    updateComboBoxInsurance();
}

private ClientsManager clientmanager;
private InsuranceManager insurancemanager;

public ClientFrame() {
    initComponents();
    clientmanager = new ClientsManager();
    clientmanager.printList();
    updateComboBoxCompany();
    updateComboBoxInsurance();
}

public void updateComboBoxCompany() 
{
    for (Object object : insurancemanager.getCompanyNames()) 
    {
        companyComboBox.addItem(object);
    }   
}

public void updateComboBoxInsurance() 
{
    for (Object object : insurancemanager.getPolicyNames()) 
    {
        insuranceComboBox.addItem(object);
    }   
}

以下是使用的方法:

public Object[] getCompanyNames() 
{
    ArrayList<String> cnames = new ArrayList<String>();
    for (InsurancesCompany company : insurancecompanyList) 
    {
        cnames.add(company.getCompanyName());
    }
    return cnames.toArray();
}

public Object[] getPolicyNames() 
{
    ArrayList<String> vnames = new ArrayList<String>();
    for (Insurance insurance : insuranceList) 
    {
        vnames.add(insurance.getPolicyName());
    }
    return vnames.toArray();
}

这就是我的列表的初始化方式:

public class InsuranceManager {

private String insurancePath;
private String insurancecompanyenPath;
private static List<InsurancesCompany> insurancecompanyList;
private static List<Insurance> insuranceList;
private Insurance currentInsurance;

public InsuranceManager() {
    insurancecompanyenPath = "Files/company.txt";
    insurancePath = "Files/insurance.txt";
    insuranceList = new List<>();
}

public void createNewList() 
{
    insurancecompanyList = new List<>();
    System.out.println("Creates list");
}

public Object[] getCompanyNames() 
{
    ArrayList<String> cnames = new ArrayList<String>();
    for (InsurancesCompany company : insurancecompanyList) 
    {
        cnames.add(company.getCompanyName());
    }
    return cnames.toArray();
}

public Object[] getPolicyNames() 
{
    ArrayList<String> vnames = new ArrayList<String>();
    for (Insurance insurance : insuranceList) 
    {
        vnames.add(insurance.getPolicyName());
    }
    return vnames.toArray();
}

编辑:这是调用 createNewList (maakLijstAan) 的 MainGUI

private ClientsManager clientsmanager;
private BillingManager billingmanager;
private InsuranceManager insurancemanager;            

public MainGUI() {
    clientsmanager = new ClientsManager();  
    clientsmanager.CreateNewList();
    insurancemanager = new InsuranceManager();
    insurancemanager.CreateNewList();
    insurancemanager.loadInsuranceCompanyList();
    initComponents();
    jMenuItem1.setText("Save clients"); 
    jMenuItem2.setText("Load clients"); 
    jMenuItem3.setText("Exit");
}

【问题讨论】:

  • 如果您告诉我们您从哪里获得 NPE,这也会有所帮助。
  • 你的变量中的这些名字到底是什么?使用一些 CamelCase 和更短的名称!2
  • 我用这一行得到 NPE:for (Object object : verzekeringbeheer.getMaatschappijNamen())
  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2)由于英语是编程和网站的默认语言,并且变量名称旨在具有指导性,因此将变量名称设为英语(并使用 CamelCase 等)。
  • @Forza:如果你得到 NPE,verzekeringbeheer 为空。由于我们没有您的那部分代码,因此无法判断问题所在

标签: java swing object arraylist jcombobox


【解决方案1】:

我只看到你使用变量,但对我来说它们是初始化的。所以它们是空的,你得到一个 NPE。

那么verzekeringmaatschappijLijstverzekeringLijst是如何初始化的呢?

【讨论】:

  • 我现在将其添加到 OP 中
【解决方案2】:

【讨论】:

  • 另见answers here中显示的对比示例。
  • 这里有很多信息!谢谢,现在会解决的;)
【解决方案3】:

您永远不会初始化 verzekeringBeheer,因此当您尝试调用该变量的方法时会得到 NullPointerException

你应该在你的构造函数中的某个地方,像这样:

verzekeringbeheer = new VerzekeringBeheer();

此外,请尽量避免使您的代码与代码的其他部分耦合。例如:

public VerzekeringBeheer() {
    ...
    //verzekeringmaatschappijLijst is never initialized!!!
}

public void maakLijstAan() 
{
    verzekeringmaatschappijLijst = new Lijst<>();
    System.out.println("Maak lijst aan");
}

public Object[] getMaatschappijNamen() 
{
    ArrayList<String> mnamen = new ArrayList<String>();
    // Here you use verzekeringmaatschappijLijst without checking that is not null!!!
    for (VerzekeringsMaatschappij maatschappij : verzekeringmaatschappijLijst) 
    {
        mnamen.add(maatschappij.getMaatschappijNaam());
    }
    return mnamen.toArray();
}

如果没有人拨打maakLijstAan,您将在getMaatschappijNamen 中获得NullPointerException。尽量避免过于依赖外部代码的代码,这样才能顺利运行。

【讨论】:

  • 我有一个调用 maakLijstAan (createNewList) 的 MainGUI 类。现在将其添加到 OP 中。
  • @Forza 我相信你在某个地方可以调用该方法。我只是说,通过选择这样的代码模式,您正在寻找麻烦、紧密耦合的代码和难以维护的代码。反正你原来的问题还是一样,你从来不实例化verzekeringBeheer
  • @Forza 也将那些 static 关键字放到你的 InsuranceManager 类中。它们是不必要的。
  • Daaamn 没有初始化 verzekeringBeheer 的所有麻烦......我现在想跳出窗口......
  • 还有一点:静态关键字是必要的,因为如果我离开它们,我会得到另一个 NPE。现在我有一个组合框工作,一个没有。 InsuranceComboBox 未加载任何值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
相关资源
最近更新 更多