我有一个JList<MyObj>,为此我创建了一个自定义ListCellRenderer<MyObj>.此列表包含在a中JScrollPane.
为了避免在运行时调整框架的大小,我希望滚动窗格始终具有适当的大小来显示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);
Run Code Online (Sandbox Code Playgroud)
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());
}
}
Run Code Online (Sandbox Code Playgroud)
当列表开始为空时,其首选大小似乎足以用于VISIBLE_ITEMS常规字符串行.但是,如果我硬编码一些MyObj来初始化列表,它具有正确的尺寸.
这是我的单元格渲染器的问题,还是这是JList一般的预期行为?
| 归档时间: |
|
| 查看次数: |
517 次 |
| 最近记录: |