我在显示按名称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
}
}
答案 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。