ArrayList排序时,DefaultListModel不会更改

时间:2012-10-31 23:28:56

标签: java swing sorting collections defaultlistmodel

我在显示按名称sortujKolekcjePoImionach()排序Person对象的方法的结果时遇到问题。当我将它放入rozpocznijProgram()时,这个方法非常有效,它正在加载一些名称并将它放在Person对象中,然后将每个Person放到ArrayList中。 DefaultListModel model刷新Jlist,因此效果很好。但是当我将方法sortujKolekcjePoImionach()放到我连接到单个按钮的其他claas时,它不起作用class sortujKolekcjePoImionach。我不知道模型是否看不到ArrayList daneOsobowe已排序或我可能不知道如何使用Collections.sort(daneOsobowe,new SortujImie());

Main.java

public class Main {

    JFrame oknoGlowne;
    JTextArea sciezkaDoPliku;
    DefaultListModel<Person> model = new DefaultListModel<>();
    JList listaOsob;
    JButton wczytaj;
    JButton sortujImie;
    JButton sortujDate;
    JButton sortujImieNazwiskoDate;
    ArrayList daneOsobowe = new ArrayList();

    public void createGUI(){

        oknoGlowne = new JFrame("Kolekcje");
        oknoGlowne.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        sciezkaDoPliku  = new JTextArea(); 

        wczytaj = new JButton("Wczytaj");

        sortujImie = new JButton("Posortuj Imiona");
        sortujDate = new JButton("Posortuj Daty");
        sortujImieNazwiskoDate = new JButton("Posortuj Imiona Nazwiska Daty");

        wczytaj.addActionListener(new rozpocznijProgram());

        listaOsob = new JList(model);  //MODEL
                    sortujImie.addActionListener(new sortujKolekcjePoImionach());  //TRYING TO SORT PERSON OBJECTS BY NAME
                    //rest of GUI...
                    oknoGlowne.setPreferredSize(new Dimension(870, 550));
        oknoGlowne.setLayout(new FlowLayout());
        oknoGlowne.setVisible(true);
        oknoGlowne.pack();
}
//METHOD WHICH IS ADDING PERSON OBJECTS TO ARRAY
class rozpocznijProgram implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent evt) {

        try {
            Wczytywanie wczytaj = new Wczytywanie(sciezkaDoPliku.getText());
            daneOsobowe = wczytaj.kopiowanieTablicy(sciezkaDoPliku.getText());

            //Collections.sort(daneOsobowe,new SortujImieNazwiskoData());

            for(int i=0; i<daneOsobowe.size(); i++){
                model.add(i, (Person) daneOsobowe.get(i));
                System.out.println(model.get(i));
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        }
    }
    //METHOD WHICH IS SORTING PERSON OBJECTS BY NAME
    class sortujKolekcjePoImionach implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent evt) {

        Collections.sort(daneOsobowe,new SortujImie());  //IT DOESN'T WORK, JLIST DOESN'T CHANGE AFTER CLICK


        }
    }

2 个答案:

答案 0 :(得分:2)

您有一个人员列表(daneOsobowe),列表中的每个人都被添加到ListModel,ListModel维护自己的人员列表。所以你实际上有两个不同的人员列表:一个在你自己的类中,一个在列表模型中。

对您自己的列表进行排序不会对模型使用的列表进行神奇的排序。即使它确实如此,模型也必须触发事件才能使视图重新绘制。

因此,如果对列表进行排序,则需要更新列表模型,以便对列表模型中的人员进行重新排序(例如,通过从模型中删除所有人员并在新模型中重新添加它们顺序)。

另一个更好的解决方案是实现自己的列表模型(基于AbstractListModel),并在此模型中提供一种排序方法,用于对内部列表进行排序并触发相应的事件。

答案 1 :(得分:1)

您需要将排序后的数据添加到表格模型中,就像您最初一样,但首先清除:

model.clear();

for (int i = 0; i < daneOsobowe.size(); i++) {
   model.add(i, (Person) daneOsobowe.get(i));
   System.out.println(model.get(i));
}

另一种方法是使用Swing的TableRowSorter。请参阅此example