0

Person オブジェクトを name でソートするメソッドの結果を表示する際に問題がありますsortujKolekcjePoImionach()。このメソッドrozpocznijProgram()は、いくつかの名前をロードして Person オブジェクトに入れ、すべての Person を ArrayList に入れると完璧に機能します。DefaultListModelmodelは Jlist を更新するため、うまく機能します。しかし、sortujKolekcjePoImionach()単一のボタンに接続する他のクラスにメソッドを配置すると、機能しません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


        }
    }
4

2 に答える 2

2

個人のリスト ( daneOsobowe) があり、リスト内の各個人が ListModel に追加され、独自の個人リストが維持されます。したがって、実際には 2 つの異なる人のリストがあります。1 つは自分のクラスにあり、もう 1 つはリスト モデルにあります。

独自のリストを並べ替えても、モデルが使用するものを魔法のように並べ替えるわけではありません。たとえそうなったとしても、ビューが自分自身を再描画するために、モデルはイベントをトリガーする必要があります。

そのため、リストを並べ替える場合は、リスト モデル内の人物の順序を変更するために、リスト モデルを更新する必要があります (たとえば、モデルからすべての人物を削除し、新しい順序で再度追加するなど)。

もう 1 つのより良い解決策は、(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 に答える