如何在Java中制作一个倒立的列表?

问题描述 投票:3回答:4

我想能够显示一个可变的列表(使用Swing),使第一个项目在底部。定格,随后的项目出现在它的上方。 就像现实中一堆东西的出现方式。 其行为就像一个FIFO队列(添加到顶部,从底部移除)。

我可以想象一个解决方案,包括 "填充 "列表,然后反向排序,或类似的东西,但我想知道是否有一个更直接的方法。

Example:
item[0]="Adam"
item[1]="Baker"
item[2]="Charlie"

should appear in 5-row list as:

+----------
|
|
| Charlie
| Baker
| Adam
+----------
java swing list reverse
4个回答
4
投票

如果你不想创建一个自定义模型,那么你可以使用DefaultListModel。然后代替使用:

model.addElement( element );

你可以使用:

model.add(0, element);

元素就会按照你想要的顺序显示。

下面的代码还展示了如何让列表看起来比实际大。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;

public class ListBottom2 extends JFrame
{
    JList list;
    JTextField textField;

    public ListBottom2()
    {
        DefaultListModel model = new DefaultListModel();
        model.add(0, "Adam");
        model.add(0, "Baker");
        model.add(0, "Charlie");
        list = new JList(model);
        list.setVisibleRowCount(5);

        JPanel box = new JPanel( new BorderLayout() );
        box.setBackground( list.getBackground() );
        box.add(list, BorderLayout.SOUTH);

        JScrollPane scrollPane = new JScrollPane( box );
        scrollPane.setPreferredSize(new Dimension(200, 95));
        add( scrollPane );

        textField = new JTextField("Use Enter to Add");
        getContentPane().add(textField, BorderLayout.NORTH );
        textField.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                JTextField textField = (JTextField)e.getSource();
                DefaultListModel model = (DefaultListModel)list.getModel();
//              model.addElement( textField.getText() );
                model.add(0, textField.getText());
                int size = model.getSize() - 1;
                list.scrollRectToVisible( list.getCellBounds(size, size) );
                textField.setText("");
            }
        });
    }

    public static void main(String[] args)
    {
        ListBottom2 frame = new ListBottom2();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }
}

4
投票

提供一个实现 列表模型 而这可以包裹任何合适的数据结构。


2
投票

只要把你的数组反过来就可以了。一行就可以了。(这并不完全有效,但可以用):

JList list = new JList(Collections.reverse(Arrays.asList(items)).toArray());

注意:如果有一个不同的UI组件以不同的方式读取数据是没有意义的。一个ListModel根据自己和JList之间的合约来保存数据。创建一个新的合同是没有意义的,因为它可以根据你想要的可视化方式,更重要的是,根据操作系统的UI标准来重新组织数据。

如果说,你想要的是一个反向的ListModel,但是,同样的道理,如果ListModel的完整实现只是朝相反的方向发展,那就没有意义了,而实际上,你需要做的只是把后盾数据结构的顺序反过来。

所以,这就是你要做的。

编辑补充一下。

我读了更多你想做的事情 看起来你想要一个固定大小的列表 数据从最后开始(像堆栈)。在这种情况下,你真正需要做的是实现你自己的ListModel。请看一下 AbstractListModel 而你应该能够扩展它并提供你自己的数据。

如果你这样做,那么你的类基本上就会(考虑这个p代码,这可能不是100%正确)。

class ReverseListModel extends AbstractListModel {

  public Object getElementAt(int i) {
    int dataIndex = fixedSize - i;
    if(dataIndex > data.length) 
      return "";
    else
      return data[dataIndex];
  }

  public int getSize() {
    return fixedSize;
  }
}

0
投票

Collections实用程序足以扭转一个集合 Collections.reverse(list)

© www.soinside.com 2019 - 2024. All rights reserved.