我知道这个主题有很多主题,但我找不到答案。
我正在使用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();
}
我无法显示文字。
非常感谢您的帮助
答案 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。