我目前正在作为大学的学校项目在博客/论坛门户上工作。
我正在使用Swing作为GUI。
我的问题是,是否可以在JPanel
上自动生成一个已经预制的JFrame
类,以便看起来像stackoverflow主页上的问题。
因此,基本上,在创建帖子时,它会进入数据库->我使用getter方法在面板上填充信息,然后它会自动将其自身生成到框架上,因此无需创建多个固定面板到框架上。
因此,如果没有帖子,该页面将为空白。创建新帖子时,它会显示为第一个帖子,下一个帖子位于该帖子之上,依此类推。
可以这样做吗?
答案 0 :(得分:0)
可以这样做吗?
当然可以。
首先,您需要扩展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);
}