将JLabel动态添加到JPanel

时间:2015-04-23 13:50:59

标签: java swing netbeans jpanel jlabel

我知道这个主题有很多主题,但我找不到答案。

我正在使用NetBeans,因此我使用Designer创建了所有静态组件。但是,在某些时候,我需要动态创建JLabel。

我有一个包含2个JPanel的JFrame 第一个是HeaderPanel,我们不在乎 第二个BodyPanel,有一个CardLayout,允许我在不同的屏幕(JPanels)之间导航。 我正在努力的屏幕是MappingPanel

        try {
        stmt = conn.createStatement();
        String sql;
        sql = "**working select query**";
        System.out.println(sql);
        ResultSet rs = stmt.executeQuery(sql);

        while(rs.next()){
            System.out.println(rs.getString("Field1")); //Display the right text in console
            JLabel a = new JLabel(rs.getString("Field1"));
            a.setVisible(true);
            MappingPanel.add(a); 
        }
    } catch (SQLException ex) {
        Logger.getLogger(MyFrame.class.getName()).log(Level.SEVERE, null, ex);
    }
    MappingPanel.revalidate();
    MappingPanel.repaint();
    BodyPanel.revalidate();
    BodyPanel.repaint();
    this.pack();
}         

我无法显示文字。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

如果要显示ResultSet中的单列数据,那么最简单的方法是使用JList。您创建一个带有DefaultListModel<String>的JList,然后在上面的while循环中,通过调用模型上的.addElement(element)为数据填充JList。

类似的东西:

在课堂上宣布:

private DefaultListModel<String> listModel = new DefaultListModel<>();
private JList<String> myList = new JList<>();

...在某些情况下代码:

     try {
        stmt = conn.createStatement();
        String sql;
        sql = "**working select query**";
        System.out.println(sql);
        ResultSet rs = stmt.executeQuery(sql);

        while (rs.next()) {
           listModel.addElement(rs.getString("Field1"));
        }
     } catch (SQLException ex) {
        Logger.getLogger(ListFun.class.getName()).log(Level.SEVERE, null, ex);
     }

注意,对于最安全的Swing线程,上面的代码应该在后台线程中完成,例如SwingWorker,field1 String应该暴露给Swing事件线程上的GUI,例如通过SwingWorker的发布/过程方法对。您还希望使用预准备语句来查询数据库。

JList当然会由GUI的一个JPanel持有。

请注意,如果您需要显示多列数据,那么我建议使用JTable。如果你绝对必须添加JLabel,那么这里的一个关键是容纳JLabel的容器JPanel的布局管理器(因为我确定你的搜索结果已经告诉过你)。您可能希望它是GridLayout(0, 1)或类似的东西 - 这意味着GridLayout具有一列和可变数量的行。容器JPanel应该保存在JScrollPane。