Создание интерактивного JList

#java #swing #jlist

#java #качели #jlist #качать

Вопрос:

Как многие, возможно, знают, компоненты в JList не могут взаимодействовать (вы не можете взаимодействовать с ними), и они похожи на моментальные снимки внешнего вида компонента. Я работаю над простым приложением, и JList — это то, что мне нужно, за исключением того, что компоненты в списке должны быть интерактивными.

До сих пор я создавал это, реализуя простую AbstractListModel и ListCellRenderer:

скриншот

Каждый компонент в JList представляет собой JPanel, который, как вы можете видеть, содержит другие компоненты, такие как JProgressBar, JLable и JButton. Единственная проблема заключается в том, что кнопки (и все остальные компоненты) не могут взаимодействовать. Как я могу это исправить?

ПРИМЕЧАНИЕ: мне не нужен JTable с одним столбцом!

Комментарии:

1. Рассмотрите возможность использования макета для создания списка вертикально выровненных компонентов, например, VerticalLayout из SwingX или BoxLayout

2. @MadProgrammer У меня действительно есть такой план на случай, если JList невозможно исправить (у меня есть использование JPanel с GridLayout). Но я буду ждать ответа на этот вопрос.

3. Я думаю, вы сами ответили на этот вопрос, JList он недоступен для редактирования, он не был разработан для того, чтобы быть, и попытка дооснастить его — это БОЛЬШАЯ тяжелая работа (и да, я действительно пытался). Вы «могли бы» использовать a MouseListener в JList , найти строку, на которую был нажат, перевести MouseEvent ее в контекст ListCellRenderer и определить, что было нажато … но первый вариант быстрее и проще (с использованием менеджера макетов)

4. @Seyed Mohammad Мне не нужен JTable с одним столбцом! == неправильное решение

5. @MadProgrammer Если вы пробовали, и для этого нет простого и понятного исправления, тогда это решено! Ответ просто заключается в том, что это невозможно сделать, и я должен искать альтернативы. Опубликуйте это как ответ, чтобы я мог его принять.

Ответ №1:

Добавление этого ответа для людей в будущем. Я только что столкнулся с точно такой же проблемой, используя JList и ListCellRenderer замечательно, если вам нужны только настраиваемые отображаемые элементы, но не полностью функциональные компоненты.

Это то, что я сделал, и работает с удовольствием:

 panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
  

а затем, когда у меня будет список информации, мне нужно динамически собрать панель:

 public void build(List<Item> items){
    panel.removeAll();
    for(Item item: items){
        panel.add(new ItemEntry(item));
    }
}
  

оберните свою панель в a JScrollPane , и она будет работать так же, как и раньше, только все ваши элементы управления теперь будут функционировать должным образом :).

Ответ №2:

Я думаю, вы ответили на это сами, JList не редактируется, он не был разработан, чтобы быть, и попытка модифицировать его, чтобы быть, это ОЧЕНЬ тяжелая работа (и да, я действительно пытался).

Вы «могли бы» использовать a MouseListener в JList , найти строку, на которую был нажат, перевести MouseEvent в контекст ListCellRenderer ‘s Component и попытаться определить, что было нажато … но, опять же, это большая дополнительная работа, которую легче выполнить другими средствами…

Рассмотрите возможность использования макета для создания списка вертикально выровненных компонентов вместо этого, возможно VerticalLayout , из SwingX или BoxLayout , например