所以,基本上我创建的是夏令营的程序,它可以将ArrayList上的子项分配到创建的Cabin中。然后将那个小屋制作成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方法中取出参数的所有内容,但我不断得到它不能为空的错误。
我想也许我不能以这种方式使用事件处理程序,所以我甚至将comboBox设置为静态,以便我可以进入AssignCamper类并从中获取该值以使其工作,但我仍然得到了同样的错误。
我已经使用DefaultListModel和JList删除了露营者并删除了小屋,它显示得很好,但由于某些原因,我无法让这个JList工作。
这里的任何线索都会很精彩。
感谢。
答案 0 :(得分:1)
错误不言自明。您的DefaultListModel
对象仍为空,因为您在声明它们时并未实际创建它们。你应该做的是
private DefaultListModel campersModel = new DefaultListModel();
private DefaultListModel campersModelAssigned = new DefaultListModel();
private DefaultListModel counselorsModel = new DefaultListModel();
private DefaultListModel counselorsModelAssigned = new DefaultListModel();