我有一个JList<MyObj>
,为此我创建了一个自定义ListCellRenderer<MyObj>
。此列表包含在JScrollPane
。
为了避免在运行时中调整框架的大小,我希望滚动窗格始终具有适当的大小来显示我的元素的VISIBLE_ITEMS
,无论列表是空的还是填充的。以下是列表的 setup 代码。
model = new DefaultListModel<>();
list = new JList<>(model);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setLayoutOrientation(JList.VERTICAL);
list.setVisibleRowCount(VISIBLE_ITEMS);
list.setCellRenderer(new MyItem());
/* ... */
JScrollPane scroll = new JScrollPane(list);
panel.add(scroll, BorderLayout.CENTER);
MyItem
定义如下。
/**
* A component that displays a single item.
*/
private static final class MyItem extends JPanel
implements ListCellRenderer<MyObj> {
// ...
private final JLabel label;
private final JTextArea text;
MyItem() {
super(new BorderLayout());
label = new JLabel(PLACEHOLDER);
text = new JTextArea(PLACEHOLDER, 3, CHARS_PER_ROW);
label.setHorizontalAlignment(SwingConstants.LEADING);
text.setEditable(false);
text.setLineWrap(true);
text.setWrapStyleWord(true);
text.setMargin(new Insets(5, 10, 5, 5));
super.add(text, BorderLayout.CENTER);
super.add(label, BorderLayout.PAGE_START);
}
@Override
public Component getListCellRendererComponent
(JList<? extends MyObj> list, MyObj value, int index,
boolean isSelected, boolean cellHasFocus) {
setLabel(value.getArg1());
text.setText(value.getArg2());
return this;
}
private void setLabel(String arg) {
label.setText(new StringBuilder(35 + arg.length())
.append("<html><b><u>").append(arg)
.append("</u></b></html>").toString());
}
}
当列表开始为空时,其首选大小似乎足以容纳VISIBLE_ITEMS
行常规字符串。但是,如果我对某些MyObj
进行硬编码以初始化列表,则它具有正确的尺寸。
这是我的单元格渲染器的问题,还是JList
的预期行为?
答案 0 :(得分:5)
我认为你想调用JList的setPrototypeCellValue(...)
方法来允许JList设置其固定的单元格宽度和高度。请查看JList API以获取更多有关此内容的详细信息以及示例。