defaultListModel分类时不会更改



我在显示方法对象按名称 sortujKolekcjePoImionach()排序的方法的结果有问题。当我将其放入rozpocznijProgram() WCHICH中加载某些名称并将其放入对象,然后将每个人放入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

        }
    }

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

对自己的列表进行排序不会神奇地对模型使用的列表进行神奇地排序。即使这样做,该模型也必须触发事件才能重新粉刷自己。

因此,如果您对列表进行排序,则需要更新列表模型,以便重新排序列表模型中的人员(例如,通过删除模型中的所有人员并将其重新添加到新的中。订购)。

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

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

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。请参阅此示例。

相关内容

  • 没有找到相关文章

最新更新