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