JList使用自定义ListCellRenderer获取错误的维度

时间:2013-11-22 23:18:37

标签: java swing jlist

我有一个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的预期行为?

1 个答案:

答案 0 :(得分:5)

我认为你想调用JList的setPrototypeCellValue(...)方法来允许JList设置其固定的单元格宽度和高度。请查看JList API以获取更多有关此内容的详细信息以及示例。