0

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

主.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


        }
    }
4

2 回答 2

2

您有一个人员列表 ( daneOsobowe),并且列表中的每个人员都被添加到一个 ListModel 中,该 ListModel 维护着自己的人员列表。因此,您实际上有两个不同的人员列表:一个在您自己的班级中,另一个在列表模型中。

对您自己的列表进行排序不会神奇地对模型使用的列表进行排序。即使这样做了,模型也必须触发事件才能让视图重新绘制自己。

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

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

于 2012-10-31T23:35:18.633 回答
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. 请参阅此示例

于 2012-10-31T23:36:39.103 回答