私はすでにこれらの投稿を読んだり試したりしましたが、役に立ちませんでした:
私が必要としてListCellRenderer
いるのは、左側にアイコンがあり、右側に動的な長さのテキストがあるパネルを返す です (他のフォーラムのように: 左側にユーザー アバター、右側に投稿テキスト)。テキストは私にはわからないので、セルの高さを固定することはできません。さらに、テキストの長さは、リスト セルごとに異なります。したがって、すべてのリスト セルには、テキストの長さに応じて独自の高さが必要です。実際には非常に一般的なレイアウトですが、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;
}
}
}