JList с пользовательским рендерером - PullRequest
3 голосов
/ 06 января 2011

У меня есть JList, который показывает несколько JPanels на них, я создал собственный рендерер, который возвращает новый JPanel. JPanels отображаются в JList, но они недоступны, я не могу выбрать их, и если у меня есть кнопка или текстовая область, я не могу нажать ее. Я хочу попробовать, если это работает в JList, потому что я хочу сделать дальнейшую нумерацию страниц. Мне удалось заставить его работать, добавив панели на панель Jscroll, но я бы хотел, чтобы все работало с JList.

Спасибо

Ответы [ 3 ]

12 голосов
/ 06 января 2011

Это нормальное поведение JListJTabel, JComboBox и т. Д.).

JPanel, который возвращает пользовательский рендерер, не добавляется в иерархию Swing. Только его paint метод используется JList, чтобы нарисовать средство визуализации в нужном месте. Средство визуализации просто выступает в качестве штампа, и в JList вы видите не компоненты, а изображения компонентов.

Это эффективный способ отображения многих компонентов на экране, не требующий дополнительных реальных компонентов. Обратите внимание, что ваш рендерер может всегда возвращать один и тот же экземпляр (это даже предпочтительнее).

Подробнее см. Учебник Swing .

Если вы хотите, чтобы записи JList действовали как реальные компоненты, вы можете сделать следующее. Сначала используйте JTable вместо JList. JTable с одним столбцом и без заголовка примерно такой же, как JList. Зачем использовать JTable? Потому что JTable предоставляет редакторы. Редакторы регистрируются на JTable, как и Renderers. Редактор обычно появляется, когда пользователь щелкает ячейку JTable. Редактор накладывается на средство визуализации, и на этот раз это настоящий компонент. Если компоненты Renderer и Editor идентичны, то у пользователя возникает ощущение, что ячейки JTable являются реальными компонентами.

В учебнике Swing есть примеры этой техники.

0 голосов
/ 29 августа 2013

Вот мое решение:

public class AccountRenderer extends DefaultListCellRenderer {

private static final long serialVersionUID = 1L;

@Override
public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {
    JLabel renderer = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    if (value != null) {
        Account entry = (Account) value;
        renderer.setText(entry.getName());
    }
    return renderer;
}

}

0 голосов
/ 06 января 2011

Я не могу выбрать их, и если у меня есть кнопка или текстовая область, я не могу нажать ее

Рендерер - это просто изображение компонента. Это не настоящий компонент, поэтому вы не можете нажать кнопку или ввести текст в текстовую область.

Для этого вам нужно использовать реальные компоненты. Поэтому, вероятно, лучше создать собственную панель с вашими компонентами, а затем добавить панель на другую панель, которая была добавлена ​​на панель прокрутки.

...