Список Java с разделением строк - PullRequest
1 голос
/ 26 апреля 2011

Эй, как мне сделать, чтобы мой список Java SWT выглядел как здесь http://flavio.tordini.org/minitunes Я имею в виду, что каждый элемент отделен линией от друг друга. Или есть какое-то другое решение, чтобы иметь список, как в minitunes, так что я могу добавить номер ... и т. Д.

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Вы должны использовать ListCellRenderer, чтобы добавить разделители в определенных позициях ...

<code>
 jList1 = new javax.swing.JList();
//String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
jList1.setModel(new javax.swing.AbstractListModel() {
    String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
    Vector v = makeVectorData(strings);
    public int getSize() { return v.size(); }
    public Object getElementAt(int i) { return v.get(i); }
});
jList1.setCellRenderer(new JlistRenderer());
jList1.addFocusListener(new JListFocusListener(jList1));</p>

<p>public class JlistRenderer extends JLabel implements ListCellRenderer {
    JSeparator separator;
    final String SEPARATOR = "SEPARATOR";
    public JlistRenderer() {
      setOpaque(true);
      setBorder(new EmptyBorder(1, 1, 1, 1));
      separator = new JSeparator(JSeparator.HORIZONTAL);
    }
    public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {
      String str = (value == null) ? "" : value.toString();
      if (SEPARATOR.equals(str)) {
        return separator;
      }
      if (isSelected) {
        setBackground(list.getSelectionBackground());
        setForeground(list.getSelectionForeground());
      } else {
        setBackground(list.getBackground());
        setForeground(list.getForeground());
      }
      setFont(list.getFont());
      setText(str);
      return this;
    }
}</p>

<p>public class JListFocusListener implements FocusListener {
     JList list;
    Object currentItem;
    final String SEPARATOR = "SEPARATOR";
    JListFocusListener(JList list) {
      this.list= list;
      list.setSelectedIndex(0);
      currentItem = list.getSelectedValue();
    }
    public void focusGained(FocusEvent e) {
      String tempItem = (String) list.getSelectedValue();
      if (SEPARATOR.equals(tempItem)) {
        list.setSelectedValue(currentItem,true);
      } else {
        currentItem = tempItem;
      }
    }
}

Надеюсь, что приведенный выше код поможет ...

0 голосов
/ 23 марта 2017

Я нашел решение, которое составляет не менее 90%:)

1. Мой рендер не расширяет ListCellRenderer, но ListCellRenderer<SomeClass>.Таким образом, подпись соответствующего метода public Component getListCellRendererComponent(JList list, SomeClass value, int index, boolean isSelected, boolean cellHasFocus).Видите ли, значение не является объектом.2. Нет необходимости для этого метода возвращать JLabel.Это может быть любой компонент.Поэтому я установил вертикальную коробку с JLabel в качестве первого содержимого и JSeparator в качестве второго.Поэтому нет необходимости иметь JSeparator в качестве каждого второго элемента в списке.В списке отображаются только объекты данных.

Это приводит к еще одной проблеме: размер JLabel в этом боксе уменьшен до минимума.Нелегко расширить его на всю ширину.Чтобы установить ширину JLabel на полную ширину в блоке, вы должны установить MaximumSize .Чтобы получить правильный размер, я использую размер JLabel, сохраняю высоту и ширину JSeparator, и устанавливаю максимальный размер JLabel в это значение.Проблема здесь: При запуске JSeparator не имеет полезного размера (0/0).Так что я жду с настройкой, пока не получу полезный размер здесь.

И вот недостающие 10%: после запуска первая ячейка списка не корректируется по размеру.Он по-прежнему отображает JLabel с минимальным размером.Это исправляется после первого обновления данных или при смене отображаемой страницы один раз и обратно.В настоящее время я не уверен, как это исправить.может быть искусственно запустить событие изменения после того, как список виден?

Добавление: я обновил первый элемент после того, как isValid() вернул true.isVisible() здесь нехорошо.

0 голосов
/ 26 апреля 2011

Самая простая вещь, о которой я могу подумать, - это использовать таблицу с одним столбцом (или, если вам нужно больше), и установить видимые строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...