我可以对 JList 进行分页吗?

3

在JList中是否有一种方法可以对结果进行分页?我有100个结果要显示,每次只想显示20个..我考虑使用表格来显示我的结果,但我正在展示推文,所以它是一个带有图像和文本等内容的JPanel..因此它是一个JList。


这将有所帮助 https://dev59.com/HXM_5IYBdhLWcg3wNgKY - jmj
1个回答

2
请看这个链接,它展示了一个分页的JList:link
这里是该类的代码:
/**
 * A paginated list. Only displays a specific number of rows
 * and allows you to page backwards and forwards through the list
 * with the help of a toolbar.
 */
public class PaginatedList extends JPanel {

    private final int pageSize;
    private final JList list;
    private final ListModel model;

    private final int lastPageNum;
    private int currPageNum;    
    private JLabel countLabel ;
    private JButton first, prev, next, last;

    /**
     * @param list the jlist
     * @param pageSize the number of rows visible in the jlist
     */
    public PaginatedList(JList list, int pageSize) {
        super();
        this.pageSize = pageSize;
        this.list = list;
        this.model = list.getModel();

        //work out how many pages there are
        this.lastPageNum = model.getSize() / pageSize + (model.getSize() % pageSize != 0 ? 1 : 0);
        this.currPageNum = 1;

        setLayout(new BorderLayout());
        countLabel = new JLabel() ;
        add(countLabel, BorderLayout.NORTH);
        add(list, BorderLayout.CENTER);
        add(createControls(), BorderLayout.SOUTH);
        updatePage();
    }

    private JPanel createControls() {
        first = new JButton(new AbstractAction("<<") {
            public void actionPerformed(ActionEvent e) {
                currPageNum = 1;
                updatePage();
            }
        });

        prev = new JButton(new AbstractAction("<") {
            public void actionPerformed(ActionEvent e) {
                if (--currPageNum <= 0)
                    currPageNum = 1;                
                updatePage();
            }
        });

        next = new JButton(new AbstractAction(">") {
            public void actionPerformed(ActionEvent e) {
                if (++currPageNum > lastPageNum)
                    currPageNum = lastPageNum;
                updatePage();

            }
        });

        last = new JButton(new AbstractAction(">>") {
            public void actionPerformed(ActionEvent e) {
                currPageNum = lastPageNum;
                updatePage();
            }
        });

        JPanel bar = new JPanel(new GridLayout(1, 4)); 
        bar.add(first);
        bar.add(prev);
        bar.add(next);
        bar.add(last);
        return bar;
    }

    private void updatePage() {

        //replace the list's model with a new model containing 
        //only the entries in the current page.
        final DefaultListModel page = new DefaultListModel();
        final int start = (currPageNum - 1) * pageSize;
        int end = start + pageSize;
        if (end >= model.getSize()) {
            end = model.getSize();
        }
        for (int i = start; i < end; i++) {
            page.addElement(model.getElementAt(i));
        }
        list.setModel(page);

        //update the label
        countLabel.setText("Page " + currPageNum + "/" + lastPageNum);

        // update buttons
        final boolean canGoBack = currPageNum != 1;
        final boolean canGoFwd = currPageNum != lastPageNum;
        first.setEnabled(canGoBack);
        prev.setEnabled(canGoBack);
        next.setEnabled(canGoFwd);
        last.setEnabled(canGoFwd);
    }    
}

使用示例:

public static void main(String args[]) throws Exception {

    // create 100 elements of dummy data. 
    Integer[] data = new Integer[100];
    for (int i = 0; i < data.length; i++) {
        data[i] = i + 1;
    }

    // create a paginated list with page size 20
    PaginatedList list = new PaginatedList(new JList(data), 20);

    // add it to a frame
    JFrame f = new JFrame();
    f.add(list);
    f.setSize(100, 100);
    f.pack();
    f.setVisible(true);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接