Возможно ли это сделать?
Конечно, это возможно.
Сначала , вам необходимо расширить JPanel
содержать компоненты, которые вам нужны.Этот подкласс JPanel
будет содержать все метки, кнопки и т. Д., Необходимые для представления данных желаемым способом.Пример:
public class CommentPanel extends JPanel {
private final JLabel usernameLabel = new JLabel();
private final JLabel timestampLabel = new JLabel();
// etc...
}
Далее , этот новый класс должен иметь способ устанавливать состояния компонентов, используя объект вашей модели. Этот шаг не является обязательным , но он даст много удобства при этом.Пример:
public void setComment(Comment comment) {
// appearance
usernameLabel.setText(comment.getUser().getName());
timestampLabel.setText(comment.getDate());
commentText.setText(comment.getContent());
// button behavior
editButton.setActionListener(e -> editComment(comment));
deleteButton.setActionListener(e -> deleteComment(comment));
}
Далее - вам нужен контейнер в родительском контейнере, например, JFrame
для хранения потенциальных сгенерированных пользовательских панелей.Для этого идеально подойдет панель с контролируемым LayoutManager
.
public class MainFrame extends JFrame {
private final JPanel commentHolder = new JPanel();
// etc...
// add `commentHolder` to this frame
}
Наконец , вам нужно создать пользовательские панели и установить данные.Если вы создали метод, заключающий в себе логику установки данных (необязательный шаг), это будет однострочник.
List<Comment> comments = fetchAllFromDb();
for (Comment comment : comments) {
// instantiate the custom panel
CommentPanel commentPanel = new CommentPanel();
// set the panel states and behavior
commentPanel.setComment(comment);
// add the created panel to the parent using the holder
commentHolder.add(commentPanel);
}