我正在使用JList包装显示给用户的一些可变只读文本。每行文本都在基于JTextArea的列表单元格中呈现,即
public class InfoTextCellRenderer extends JTextArea implements ListCellRenderer
并且该渲染器由列表使用:
textList.setCellRenderer(new InfoTextCellRenderer());
JList嵌入在JScrollPane中。
我这么做是因为这里的典型使用模式是使用箭头键,而不是鼠标。这样可以突出显示当前单元格,让用户清楚地看到正在发生的事情。以前的实现使用单个JTextArea,要求用户多次按下向下箭头,直到不可见的插入符号(因为不可编辑而不可见)到达可以滚动的位置(窗口的底部或顶部)。
问题是,即使InfoTextCellRenderer打开换行和换行,当显示文本时,也不会发生换行。
public class InfoTextCellRenderer extends JTextArea implements ListCellRenderer {
public InfoTextCellRenderer() {
this.setFocusable(false);
}
/* (non-Javadoc)
* @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
*/
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setEditable(false);
setFont(list.getFont());
this.setLineWrap(true);
this.setWrapStyleWord(true);
setText(value == null ? "" : value.toString());
return this;
}
}
是什么阻止了换行的发生?
在另一篇Stack Overflow帖子中找到了我的答案,尽管我没有立即清楚它与我的情况的相关性:https://stackoverflow.com/questions/7306295/swing-jlist-with-multiline-text-and-dynamic-height?rq=1