Witajcie. Mam pewien problem.
Jak zrobić zawijanie wierszy w JList?
0
0
widziałem to, ale to raczej u mnie nie zadziała z takiego powodu, że mam Listę, której szerokość zmienia się względem okna, mam to dodane do BorderLayouta jako NORTH i jeśli ktoś powiększy okno, to powiększy się również lista
na necie znalazłem kilka sugestii, żeby wykorzystać CellRenderer i zmienić polę JListy na jakieś pole, na ktorym można wywołać funkcję, setWrap...
nie wiem niestety jak to wykorzystać
0
Coś takiego stworzyłem
class TextAreaRenderer extends DefaultListCellRenderer {
private JTextArea area;
public TextAreaRenderer() {
area = new JTextArea();
area.setLineWrap(true);
}
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
area.setText((String)value);
area.setFont(label.getFont());
area.setForeground(label.getForeground());
area.setBackground(label.getBackground());
area.setBorder(label.getBorder());
int textWidth = area.getFontMetrics(area.getFont()).stringWidth(area.getText());
int listWidth = list.getWidth() - (list.getInsets().left + list.getInsets().right);
area.setRows(textWidth/listWidth+1);
return area;
}
}
Jednak aby to zadziałało musiałem po zmianie rozmiaru tworzyć na nowo renderer, czyli:
list.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
list.setCellRenderer(new TextAreaRenderer());
}
});
Wiec nie jest to chyba zbyt wydajny sposób, ale działa.