#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
он недоступен для редактирования, он не был разработан для того, чтобы быть, и попытка дооснастить его — это БОЛЬШАЯ тяжелая работа (и да, я действительно пытался). Вы «могли бы» использовать aMouseListener
в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
, например