java - 为什么会返回 "dataModel must be non null"错误?

标签 java hashmap jlist defaultlistmodel

所以,基本上我正在创建的是一个夏令营程序,它可以将 ArrayList 上的 child 分配到创建的小屋中。然后,该小屋被制作成一个 HashMap,其中 Cabin 对象作为键,Camper 对象作为元素。

我不会扔掉几页代码让每个人都检查出什么问题,而是只在代码片段上添加每个对象所引用内容的注释。

 public class SelectCabin extends JFrame {







private JComboBox comboBox;


public SelectCabin() {
    super("ASSIGN CABINS");
    getContentPane().setForeground(Color.CYAN);
    getContentPane().setBackground(new Color(205, 133, 63));
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(300, 300, 850, 600);
    getContentPane().setLayout(null);



    JButton deleteButton = new JButton("SELECT");
    deleteButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            AssignCampers group = new AssignCampers();  //   **Error occurs here

            group.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            group.getOrCreateGroup((Cabin)comboBox.getSelectedItem());
  //Gets the Cabin from the drop down list, and creates a HashMap with that Cabin as the key. 
            group.initCampersModel((Cabin)comboBox.getSelectedItem());  
 //Initializes the model based on the cabin it is selecting, so it only shows campers that meet that cabin criteria.  That has not been implemented yet though. 
            group.setVisible(true);




        }
    });
    deleteButton.setBackground(new Color(255, 215, 0));
    deleteButton.setFont(new Font("Tahoma", Font.BOLD, 18));
    deleteButton.setBounds(324, 403, 156, 64);
    getContentPane().add(deleteButton);

    JLabel lblSelectACabin = new JLabel("Select a Cabin to Assign Campers To");
    lblSelectACabin.setFont(new Font("Tahoma", Font.BOLD, 18));
    lblSelectACabin.setBounds(240, 33, 464, 82);
    getContentPane().add(lblSelectACabin);

     comboBox=new JComboBox();
    comboBox.setBounds(289, 146, 226, 41);
    comboBox.setModel(new DefaultComboBoxModel(NewCabin.cabinList.toArray()));
    getContentPane().add(comboBox);


}
    }

SelectCabin 类基本上采用创建并添加到静态 ArrayList 中的 Cabin 对象,将它们放入下拉菜单中,并允许您选择一个。

一旦选择其中一个,事件处理程序就会在AssignCamper 类中打开。该类包含一些方法,其中一个方法创建 HashMap,另一个方法创建 JList 供露营者添加到小屋中。到目前为止,我只创建了一个 JList,因为该程序到目前为止还无法运行,所以我不会继续犯同样的错误。

这是AssignCamper 类。

  public class AssignCampers extends JFrame {

private JPanel contentPane;

static Map<Cabin, Set<Camper>> cabinMap= new HashMap<>();
static Map<Cabin, Set<Counselor>> cabinMapCounselor= new HashMap<>();



 private DefaultListModel campersModel;
private DefaultListModel campersModelAssigned;   //not used yet
private DefaultListModel counselorsModel;            //not used yet
private DefaultListModel counselorsModelAssigned;    //not used yet




public AssignCampers() {
    getContentPane().setForeground(Color.CYAN);
    getContentPane().setBackground(Color.GREEN);
    getContentPane().setLayout(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(300, 300, 850, 700);
    getContentPane().setLayout(null);

    JScrollPane scrollPaneAddedCampers = new JScrollPane();


     JScrollPane scrollPaneCampers= new JScrollPane();



    scrollPaneAddedCampers.setBounds(495, 299, 258, 275);
    scrollPaneCampers.setBounds(83, 299, 258, 275);
    getContentPane().add(scrollPaneAddedCampers);

    getContentPane().add(scrollPaneCampers);

    JList camperJlist = new JList(campersModel);    //**Error Occurs Here
    scrollPaneCampers.setViewportView(camperJlist);




     JScrollPane scrollPaneCounselors = new JScrollPane();


    scrollPaneCounselors.setBounds(83, 154, 258, 100);
    getContentPane().add(scrollPaneCounselors);

     JScrollPane scrollPaneAddedCounselors = new JScrollPane();


    scrollPaneAddedCounselors.setBounds(495, 154, 258, 100);
    getContentPane().add(scrollPaneAddedCounselors);

    JButton btnAdd = new JButton("-->");
    btnAdd.setFont(new Font("Tahoma", Font.BOLD, 20));
    btnAdd.setBounds(365, 327, 97, 67);
    getContentPane().add(btnAdd);

    JButton btnRemove = new JButton("<--");
    btnRemove.setFont(new Font("Tahoma", Font.BOLD, 20));
    btnRemove.setBounds(365, 445, 97, 67);
    getContentPane().add(btnRemove);

    JButton btnAddCounselor = new JButton("-->");
    btnAddCounselor.setFont(new Font("Tahoma", Font.BOLD, 13));
    btnAddCounselor.setBounds(365, 168, 97, 25);
    getContentPane().add(btnAddCounselor);

    JButton btnRemoveCounselor = new JButton("<--");
    btnRemoveCounselor.setFont(new Font("Tahoma", Font.BOLD, 13));
    btnRemoveCounselor.setBounds(365, 206, 97, 25);
    getContentPane().add(btnRemoveCounselor);




}

public Set<Camper> getOrCreateGroup(Cabin cabin){
    return AssignCampers.cabinMap.computeIfAbsent(cabin, (unused)-> new HashSet<>());
}

public void initCampersModel(Cabin cabin){

    Collections.sort(NewCamper.camperList2, new Comparator<Camper>(){
        public int compare(Camper c1, Camper c2){
            return c1.getDob().compareTo(c2.getDob());
        }
    });
    for(Camper c: NewCamper.camperList2){   //static ArrayList

            campersModel.addElement(c);

    }

}
 }

我已经尝试了一切,从删除 CampersModel 的排序方式,到从 initCampersModel 方法中取出参数,但我不断收到它不能为非空的错误。

我想也许我不能那样使用事件处理程序,所以我什至将组合框设为静态,以便我可以进入AssignCamper类并从中获取该值以使其工作,但我仍然遇到同样的错误。

我已经使用 DefaultListModel 和 JList 来删除露营者和删除小屋,它显示得很好,但由于某种原因,我无法让这个 JList 工作。

这里的任何线索都会很棒。

谢谢。

最佳答案

该错误是不言自明的。您的 DefaultListModel 对象仍然为 null,因为您在声明它们时并未实际创建它们。你应该做的是

private DefaultListModel campersModel = new DefaultListModel();
private DefaultListModel campersModelAssigned = new DefaultListModel();
private DefaultListModel counselorsModel = new DefaultListModel();
private DefaultListModel counselorsModelAssigned = new DefaultListModel();

关于java - 为什么会返回 "dataModel must be non null"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50041339/

相关文章:

c++ - 如何获取使用 hash_map 构建的旧 C++ 代码?

java - Hashmap 中相同键的数据更新

java - 在 JList 中写一些东西

java - 使JList中的按钮可点击

java - 一种完成 @ConditionalOn*ANY*Class 的方法?

java - 方法中的警报对话框 - Android

java - Jersey 客户端和 CXF 混淆(多部分问题)

java - Java错误: Comparison method violates its general contract

arrays - 将数组、标量和散列传递给 Perl 中的子例程

java - 添加新元素后,带有自定义 CellRenderer 的 Swing JList 消失