具有行分隔的Java列表

时间:2011-04-26 06:45:07

标签: java user-interface swt

嘿,我如何让我的java SWT列表看起来像这里http://flavio.tordini.org/minitunes我的意思是每个元素都是由彼此分隔的一行。或者我有任何其他解决方案,以获得像minitunes一样的列表,所以我可以添加数字..等等。

3 个答案:

答案 0 :(得分:1)

您应该使用ListCellRenderer在特定位置添加分隔符......


 jList1 = new javax.swing.JList();
//String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
jList1.setModel(new javax.swing.AbstractListModel() {
    String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
    Vector v = makeVectorData(strings);
    public int getSize() { return v.size(); }
    public Object getElementAt(int i) { return v.get(i); }
});
jList1.setCellRenderer(new JlistRenderer());
jList1.addFocusListener(new JListFocusListener(jList1));

public class JlistRenderer extends JLabel implements ListCellRenderer { JSeparator separator; final String SEPARATOR = "SEPARATOR"; public JlistRenderer() { setOpaque(true); setBorder(new EmptyBorder(1, 1, 1, 1)); separator = new JSeparator(JSeparator.HORIZONTAL); } public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { String str = (value == null) ? "" : value.toString(); if (SEPARATOR.equals(str)) { return separator; } if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } setFont(list.getFont()); setText(str); return this; } }

public class JListFocusListener implements FocusListener { JList list; Object currentItem; final String SEPARATOR = "SEPARATOR"; JListFocusListener(JList list) { this.list= list; list.setSelectedIndex(0); currentItem = list.getSelectedValue(); } public void focusGained(FocusEvent e) { String tempItem = (String) list.getSelectedValue(); if (SEPARATOR.equals(tempItem)) { list.setSelectedValue(currentItem,true); } else { currentItem = tempItem; } } }

希望上面的代码有帮助...

答案 1 :(得分:0)

我能想到的最简单的事情就是使用一个表格(或者如果你需要更多的话),并设置线条可见。

答案 2 :(得分:0)

我找到了至少90%的解决方案:)

1.我的渲染器不会扩展ListCellRenderer,而是扩展ListCellRenderer<SomeClass>。所以相关方法的签名是public Component getListCellRendererComponent(JList list, SomeClass value, int index, boolean isSelected, boolean cellHasFocus)。 你看,价值不是对象。 2.此方法无需返回JLabel。它可以是任何组件。所以我设置了一个垂直Box,其中JLabel作为第一个内容,JSeparator作为第二个。因此,不需要将JSeparator作为列表中的每个第二个元素。该列表仅显示要显示的数据对象。

这会导致另一个问题:该Box中的JLabel的大小减小到最小。将其扩展到整个宽度并不容易。要将JLabel宽度设置为Box中的整个宽度,您必须设置 MaximumSize 。为了获得正确的大小,我使用JLabel的大小,保持高度,并使用JSeparator的宽度,并将JLabel最大大小设置为该值。这里的问题是:在启动时,JSeparator没有有用的大小(0/0)。所以我等待调整,直到我得到一个有用的大小。

这里缺少10%:启动后,列表的第一个单元格没有调整大小。它仍然以最小尺寸显示JLabel。在第一次数据更新后,或者一次又一次地更改显示的页面时,这会得到纠正。我目前还不确定如何解决这个问题。列表可见后,可能会人为地触发更改事件?

附录:我在isValid()返回true后对第一个元素进行了更新。 isVisible()在这里并不好。