我已經讀/嘗試了這些職位,但沒有幫助:多行文本和動態高度的Swing JList的
- Display multiple lines within a Jlist cell
- How to get multiline for a Jlist text?
- Problem displaying components of JList
我需要的是一個ListCellRenderer
,它返回一個面板,左側有一個圖標,右側有一個動態長度的文本(如在任何論壇中:左側是用戶頭像,右側是t他發佈文字)。文本是不是我知道,所以我不能設置一個固定的細胞高度。此外,文本長度不同於列表單元格到列表單元格。因此,根據文本的長度,每個列表單元格都需要自己的高度。其實是一個非常常見的佈局......但不適合Swing。單元格高度根據文本長度不會擴展。
我已經在JList
幾乎讀過關於動態單元格高度和多行文本的任何文章,但找不到解決方案。所以我決定給一個小小的SSCCE。請給我一個關於如何實現我所描述的內容的提示,或者如果您認爲它很簡單,請修復我的代碼。
感謝
以下是部份SSCCE:
public class MultiLineList extends JFrame
{
private static final long serialVersionUID = 1L;
public static void main(final String[] args)
{
new MultiLineList();
}
private MultiLineList()
{
setTitle("MultiLineList");
setSize(800, 450);
setResizable(true);
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.getContentPane().setLayout(new BorderLayout());
final DefaultListModel model = new DefaultListModel();
model.addElement("This is a short text");
model.addElement("This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. ");
model.addElement("This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. This is an even longer text. ");
final JList list = new JList(model);
list.setCellRenderer(new MyCellRenderer());
this.add(list);
this.getContentPane().invalidate();
this.getContentPane().validate();
}
public class MyCellRenderer extends DefaultListCellRenderer
{
@Override
public Component getListCellRendererComponent(final JList list, final Object value, final int index, final boolean isSelected, final boolean hasFocus)
{
final String text = (String) value;
//create panel
final JPanel p = new JPanel();
p.setLayout(new BorderLayout());
//icon
final JPanel IconPanel = new JPanel(new BorderLayout());
final JLabel l = new JLabel("icon"); //<-- this will be an icon instead of a text
IconPanel.add(l, BorderLayout.NORTH);
p.add(IconPanel, BorderLayout.WEST);
//text
final JTextArea ta = new JTextArea();
ta.setText(text);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
p.add(ta, BorderLayout.CENTER);
return p;
}
}
}
與手頭問題無關:a)neve如果new不滿足is-a要求,則不要使用_extend_類 – kleopatra
請注意,SSCCE應包含導入。並不是所有人都可以使用automagic IDE來搞清楚它們! –
我會記住 – haferblues