我希望能够显示一个可变列表(使用Swing),使第一个项目位于底部处于固定位置,后续项目显示在其上方。就像一堆东西会出现在现实中的方式。行为是FIFO队列的行为(添加到顶部,从底部删除)。
我可以想象一个解决方案涉及“填充”列表然后反向排序,或类似的东西,但我想知道是否可能有更直接的方式。
Example:
item[0]="Adam"
item[1]="Baker"
item[2]="Charlie"
should appear in 5-row list as:
+----------
|
|
| Charlie
| Baker
| Adam
+----------
答案 0 :(得分:4)
提供ListModel的实现,并且可以包装任何适当的数据结构。
答案 1 :(得分: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 );
}
}
答案 2 :(得分: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;
}
}