Перенос слов в элементах JList
У меня есть JList
с очень длинными именами элементов, которые вызывают горизонтальную полосу прокрутки в области прокрутки.
Можно ли в любом случае переносить слова, чтобы все имя элемента отображалось в 2 рядах, но можно было выбрать его одним щелчком мыши? То есть он должен вести себя как один элемент, но отображаться в двух строках.
Вот что я сделал, увидев пример ниже
Я добавил новый класс в свой проект MyCellRenderer, а затем я добавил MyList.setCellRenderer(new MyCellRenderer(80));
в коде пост пост создания моего списка. Есть ли что-нибудь еще, что мне нужно сделать?
3 ответа
Да, используя код Эндрю, я придумал что-то вроде этого:
import java.awt.Component;
import javax.swing.*;
public class JListLimitWidth {
public static void main(String[] args) {
String[] names = { "John Smith", "engelbert humperdinck",
"john jacob jingleheimer schmidt" };
MyCellRenderer cellRenderer = new MyCellRenderer(80);
JList list = new JList(names);
list.setCellRenderer(cellRenderer);
JScrollPane sPane = new JScrollPane(list);
JPanel panel = new JPanel();
panel.add(sPane);
JOptionPane.showMessageDialog(null, panel);
}
}
class MyCellRenderer extends DefaultListCellRenderer {
public static final String HTML_1 = "<html><body style='width: ";
public static final String HTML_2 = "px'>";
public static final String HTML_3 = "</html>";
private int width;
public MyCellRenderer(int width) {
this.width = width;
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
String text = HTML_1 + String.valueOf(width) + HTML_2 + value.toString()
+ HTML_3;
return super.getListCellRendererComponent(list, text, index, isSelected,
cellHasFocus);
}
}
Это можно сделать еще проще. Вы можете создать JList с помощью consatructor с ListModel. В CustomListModel расширяется AbstractListModel, метод getElementAt() может возвращать строку с тем же текстом в формате html. Таким образом, сделайте то же самое без модификации рендерера ячейки.
Вы также можете динамически вычислить ширину (вместо фиксированного значения):
String text = HTML_1 + String.valueOf(**list.getWidth()**) + HTML_2 + value.toString() + HTML_3;
Таким образом, если панель изменяет размер списка, перенос остается корректным.
Обновить