Java 对 jlist 的元素进行排序

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18302406/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 00:17:54  来源:igfitidea点击:

sorting the elements of a jlist

javajlist

提问by Adrian Tim

I am trying to sort a JList when pressing the sort button but I can't figure it out how. This is my code:

我试图在按下排序按钮时对 JList 进行排序,但我不知道如何排序。这是我的代码:

Song class:

歌曲类:

package song;

public class Song implements Comparable<Song>{
    private String name;
    private String artist;

    public Song(String name, String artist){
        this.name = name;
        this.artist = artist;
    }

    public String getName(){
        return name;
    }

    public String getArtist(){
        return artist;
    }

    public void setArtist(String artist){
        this.artist = artist;
    }

    public void setName(String name){
        this.name = name;
    }

    public int compareTo(Song s){
        return this.name.compareTo(s.getName());
    }

    public String toString(){
        return name + " " + artist;
    }
}

List Model:

列表型号:

package song;

import java.util.ArrayList;
import java.util.Collections;

import javax.swing.AbstractListModel;

public class ListModel extends AbstractListModel{
    ArrayList<Song> songs;

    public ListModel(ArrayList<Song> array){
        songs = array;
    }

    public int getSize(){
        return songs.size();
    }

    public Object getElementAt(int index){
        return (Song)songs.get(index);
    }

    public ArrayList<Song> getSongList(){
        return songs;
    }

    public void setList(ArrayList<Song> array){
        this.songs = array;
    }

    public void getSortedList(ArrayList<Song> array){
        Collections.sort(array);
        songs = array;
    }
}

App class:

应用类:

    package song;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collections;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;

public class App extends JFrame{
    JFrame frame;
    JList<Song> list;
    ArrayList<Song> songList;
    ListModel songModelList;
    private static final String FILE =  "songs.txt";
    JPanel loadPanel, addBtnPanel;
    JButton btnLoad, btnSort, btnAdd, btnSave;
    JTextField txtArtist, txtName;

    public static void main(String[] args){
        App a = new App();
    }

    public App(){
        frame = new JFrame("Playlist");

        loadPanel = createLoadPanel();
        loadPanel.setBackground(Color.BLUE);

        JPanel btnPanel = createButtonPanel();
        btnPanel.setBackground(Color.ORANGE);
        frame.getContentPane().add(btnPanel,BorderLayout.EAST);
        frame.getContentPane().add(loadPanel,BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
//      frame.pack();s
        frame.setVisible(true);

    }

    public JPanel createButtonPanel(){
        JPanel panel = new JPanel();
        btnLoad = new JButton("Load List");
        btnSort = new JButton("Sort list");
        btnAdd = new JButton("Add");
        btnSort.addActionListener(new ActionListener() { //here is the action listener for the button used for sorting

            @Override
            public void actionPerformed(ActionEvent e) {
//              Collections.sort(songList);
//              songModelList.setList(songList);
                songModelList.getSortedList(songList);
                list.updateUI();
            }
        });
        btnLoad.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                loadPanel.setVisible(true);
            }
        });
        btnAdd.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                addBtnPanel = createAddPanel();
            }
        });

        panel.add(btnLoad);
        panel.add(btnSort);
        panel.add(btnAdd);

        return panel;
    }

    public JPanel createAddPanel(){
        JFrame frame = new JFrame();
        JPanel panel = new JPanel(new GridLayout(3,2));
        JLabel lblName = new JLabel("Name");
        JLabel lblArtist = new JLabel("Artist");
        txtName = new JTextField(15);
        txtArtist = new JTextField(15);
        panel.add(lblName);
        panel.add(txtName);
        panel.add(lblArtist);
        panel.add(txtArtist);
        btnSave = new JButton("Save");
        panel.add(btnSave);
        btnSave.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String name = txtName.getText();
                String artist = txtArtist.getText();
                Song s = new Song(name, artist);
                songModelList.getSongList().add(s);
                list.updateUI();
            }
        });

        frame.getContentPane().add(BorderLayout.CENTER,panel);
        frame.setVisible(true);
        frame.setSize(new Dimension(300,100));
        return panel;
    }

    public JPanel createLoadPanel(){
        JPanel LoadPanel = new JPanel();
        list = new JList<Song>();
        songList = loadFromFile();
        songModelList = new ListModel(songList);
        songList = new ArrayList<Song>();
        list.setModel(songModelList);
        list.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        LoadPanel.add(list);
        LoadPanel.setVisible(false);
        return LoadPanel;

    }

    public ArrayList<Song> loadFromFile(){
        ArrayList<Song> array = new ArrayList<Song>();
        try{
            BufferedReader reader = new BufferedReader(new FileReader(FILE));
            String line = null;
            while((line = reader.readLine()) != null){
                String[] parts = line.split(" - ");
                if(parts.length == 2){
                    String name = parts[0];
                    String artist = parts[1];
                    Song s = new Song(name, artist);
                    array.add(s);
                }
                else{
                    System.out.println("Invalid line!");
                }
            }
            reader.close();
        }catch(IOException e){
            System.out.println("File not found");
            e.printStackTrace();
        }
        return array;
    }
}

So, the JList desplays the elements in the order they are added. But if the user wants to sort them I made a sort button and when the button is pressed the JList shows the elements in sorted order. How do I manage to do that? I tried over and over again but it doesn't work.

因此,JList 按元素添加的顺序显示元素。但是如果用户想对它们进行排序,我做了一个排序按钮,当按下按钮时,JList 按排序顺序显示元素。我该如何做到这一点?我一遍又一遍地尝试,但它不起作用。

采纳答案by Ivan Babanin

Just add method sort() to ListModel:

只需将方法 sort() 添加到 ListModel :

public void sort(){
    Collections.sort(songs);
    fireContentsChanged(this, 0, songs.size());
}

And fix btnSort action:

并修复 btnSort 操作:

btnSort.addActionListener(new ActionListener() { 
    @Override
    public void actionPerformed(ActionEvent e) {
        songModelList.sort();
    }
});

回答by kiheru

You need to call the appropriate fire*method of the list model when you have modified the contents. Call fireContentsChanged(this, 0, songs.size() - 1)in getSortedList(). (Which, by the way, is confusingly named).

fire*当您修改了内容时,您需要调用列表模型的相应方法。打fireContentsChanged(this, 0, songs.size() - 1)进来getSortedList()。(顺便说一下,这是一个令人困惑的名字)。

回答by Josh M

In your model, try using a TreeSet<Song>and then create a Comparator<Song>and pass it into the constructor of your TreeSet<Song>. It will automatically sort all the elements as elements are added.

在您的模型中,尝试使用 aTreeSet<Song>然后创建 aComparator<Song>并将其传递到您的TreeSet<Song>. 添加元素时,它将自动对所有元素进行排序。