自动在JFrame

时间:2019-01-30 13:49:11

标签: java swing jpanel

我目前正在作为大学的学校项目在博客/论坛门户上工作。

我正在使用Swing作为GUI。

我的问题是,是否可以在JPanel上自动生成一个已经预制的JFrame类,以便看起来像stackoverflow主页上的问题。

因此,基本上,在创建帖子时,它会进入数据库->我使用getter方法在面板上填充信息,然后它会自动将其自身生成到框架上,因此无需创建多个固定面板到框架上。

因此,如果没有帖子,该页面将为空白。创建新帖子时,它会显示为第一个帖子,下一个帖子位于该帖子之上,依此类推。

可以这样做吗?

1 个答案:

答案 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);
}