嘿,我如何使我的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()
在这里不好。