Zawijanie wierszy w JList

0

Witajcie. Mam pewien problem.
Jak zrobić zawijanie wierszy w JList?

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1