假设我在数据库中有一些数据,而我正在使用查询检索它。
示例:
SELECT * FROM acsuserdetail where "+useranme+"= '"+arg+"' "
System.out.print(" FirstName = " + rs.getString("FirstName"));
这将返回两个结果,即:
FirstName = Anurag
FirstName = Arvind
但是当我在UI中以JFrame
显示此数据时,它会打开两个具有两个细节的帧,如果有更多细节,则会打开该帧数。这可能是因为来自数据库的数据一个接一个地出现。我希望所有信息都在一个框架中进行整合。 UI代码是: -
public UIForShowingData(String data) {
frame = new JFrame("Showing Data");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
frame.setSize(300, 300);
button = new JButton("OK");
frame.setLayout(null);
button.setBounds(250, 250, 40, 50);
frame.add(button);
System.out.println(data.length());
tx = new JTextField(data);
frame.add(tx);
tx.setBounds(50, 50, 40, 50);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
frame.dispose();
}
});
}
答案 0 :(得分:0)
请注意,根据您的问题中的代码段,目前尚不清楚发生了什么。但是我会在黑暗中拍摄,并猜测通过查询数据库获得的结果集中的每条记录都会调用UIForShowingData(String data)
方法。
这样的事情:
while (rs.next()) {
...
UIForShowingData ui = new UIForShowingData(rs.getString("FirstName"));
...
}
这可以解释为什么在数据库中存在记录时打开了许多帧。要解决此问题,您可以考虑使用Collection存储多个值,并使用此集合在单个JFrame
中正确显示数据。可能使用JList或JTable比使用文本字段显示记录更好。
请注意,您的查询容易受SQL injection次攻击。为避免这种情况,您可能需要尝试使用PreparedStatement。例如:
String query = "SELECT * FROM acsuserdetail where useranme = ?";
PreparedStatement pst = connection.prepareStatement(query);
pst.setString(arg); // where arg is the argument to compare with
ResultSet rs = pst.executeQuery();
Swing旨在与Layout Managers一起使用,因此不鼓励使用null
布局和方法,例如setBounds(...)
,setLocation(...)
和setXxxSize(...)
。来自Swing tutorials:
虽然可以不使用布局管理器,但您应该使用 布局经理,如果可能的话。布局管理器使其更容易 调整依赖于外观和感觉的组件外观 不同的字体大小,容器的大小变化,以及不同的 语言环境。布局管理器也可以被其他人轻松重用 容器,以及其他程序。
另见这些主题: