用户界面-带有行分隔的Java列表



嘿,我如何使我的java SWT列表看起来像这里http://flavio.tordini.org/minitunes我的意思是,每个元素都被一条线隔开。或者我有其他的解决方案,可以像在迷你图中一样列出一个列表,这样我就可以添加数字。。等等

您应该使用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; } } }

希望以上代码能帮助。。。

我能想到的最简单的事情是使用一个有一列的表(或者如果需要更多(,并将行设置为可见。

我找到了一个至少90%的解决方案:(

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新