java - JList 使用自定义 ListCellRenderer 获得错误的尺寸

标签 java swing jlist

我有一个JList<MyObj> ,我为此创建了一个自定义 ListCellRenderer<MyObj> 。此列表包含在 JScrollPane 中.

为了避免在运行时调整框架大小,我希望滚动 Pane 始终具有适当的大小来显示 VISIBLE_ITEMS我的元素的数量,无论列表是从空开始还是已填充。以下是列表的设置代码。

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 的预期行为? ,一般来说?

最佳答案

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

关于java - JList 使用自定义 ListCellRenderer 获得错误的尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20156288/

相关文章:

java - 如何在netbeans的GUI中显示文件内容?

java - 将鼠标位置分派(dispatch)给 JList 的自定义单元格渲染器中的组件

java - 禁用单个 JComboBox 项

java - 函数结果 AS 类字段值

java - 以编程方式绘制选择器

java - 返回 Java 中的泛型类型

java - Java中如何将变量从一个JFrame传递到多个JFrame?

java - 刷新 JPanel-移动 JLabel

java - 尝试实现安全模块的编辑版本时出现应用程序错误

java - 为 JTable 中第一列的单元格加载 JList