Перенос слов в элементах JList - PullRequest
8 голосов
/ 20 ноября 2011

У меня есть JList с очень длинными именами элементов, из-за которых горизонтальная полоса прокрутки появляется на панели прокрутки.

В любом случае можно ли переносить слова, чтобы отображалось все имя элемента целикомв 2 строки еще можно выделить одним кликом?То есть он все равно должен вести себя как один элемент, но отображаться в двух строках


Вот что я сделал, увидев приведенный ниже пример

Я добавил новый класс в свой проект MyCellRenderer, а затем добавил MyList.setCellRenderer(new MyCellRenderer(80)); в код пост-создания моего Списка.Есть ли что-нибудь еще, что мне нужно сделать?

Ответы [ 3 ]

19 голосов
/ 20 ноября 2011

Да, используя код Эндрю, я придумал что-то вроде этого:

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);
   }

}
0 голосов
/ 09 января 2018

Это можно сделать еще проще. Вы можете создать JList с помощью consatructor с ListModel. В CustomListModel расширяется AbstractListModel, метод getElementAt () может возвращать строку с тем же текстом в формате html. Таким образом, сделайте то же самое без модификации средства визуализации ячеек.

0 голосов
/ 07 августа 2012

Вы также можете динамически вычислять ширину (вместо фиксированного значения):

String text = HTML_1 + String.valueOf(**list.getWidth()**) + HTML_2 + value.toString() + HTML_3;

Таким образом, если панель изменяет размер списка, перенос остается правильным.

Обновить

И результат выглядит так: enter image description here

...