我的表单中有2个面板绑定到父面板,其面板设置为卡片布局。
在JFrame
的构造函数中,执行数据库操作并获取数据并用于填充JList
。
然后,当用户点击某个项目时,新的面板(作为CardLayout
的一部分)会显示JTable
,其中填充了根据用户所做的选择从数据库中获取的数据列表框。
该计划基本上是一个诊所管理系统。
在此JFrame
中,收银员可以查看要支付账单的患者的身份证号码。这些ID号在JList
中显示为列表。
点击列表后,选择患者ID,然后从数据库中查询处方药并显示在表中,同时显示药物ID&价钱。
问题在于,每当我尝试向ArrayOutOfBoundsException
添加行时,我都会收到JTable
。
这些是在mouseclick事件(全局)
之外声明的private Connection medDbConn = Connect("medicines.db");
private PreparedStatement mPst = null;
private ResultSet mRs = null;
private Connection conn = Connect("bills.db");
private PreparedStatement pst = null;
private ResultSet rs = null;
private ArrayList medicines_fine = new ArrayList();
private ArrayList medicines_fine_name = new ArrayList();
private ArrayList medicines_fine_qty = new ArrayList();
private ArrayList medicines_id = new ArrayList();
private ArrayList medicines_price = new ArrayList();
private ArrayList medicines_subtotal = new ArrayList();
private Double cf = 0.00;
/**
* Creates new form ViewBills
*/
private DefaultListModel listmodel;
private DefaultListModel model;
以下内容在JList
的鼠标点击事件中执行。
// GET SELECTED VALUE FROM LIST
String listvalue = (String) jList1.getSelectedValue();
// SPLIT THE SELECTED LIST VALUE INTO ID AND DATETIME
String[] datas = listvalue.split("=");
// datas[0] = id and datas[1] = datetime
// STORE PATIENTID and DATETIME
String Patient_Id = datas[0].trim();
String DateTime = datas[1].trim();
String medicines_raw = null;
String[] medicines;
String[] keypair;
try {
// CONNECT THE DATABASE & PREPARE IT . THEN SET THE VALUES & FURTHER EXECUTE QUERY TO GET RESULT INTO "rs"
pst = conn.prepareStatement("SELECT CONSULTFEE,MEDICINES FROM VIEWBILLS WHERE ID=? AND DATETIME=?");
pst.setString(1, Patient_Id);
pst.setString(2, DateTime);
rs = pst.executeQuery();
// IF THERE IS A RECORD , THEN DO SOMETHING
if (rs.next()) {
cf = rs.getDouble("consultfee");
// GET THE RAW VALUE IN THE FORMAT Aspirin=12,sdsd=1,asdasd=2
medicines_raw = rs.getString("medicines");
// SPLIT THE WORD BY COMMAS AND STORE INTO ARRAY , SO EACH INDEX has Aspirin=12 kind of values
medicines = medicines_raw.split(",");
for (int i = 0; i < medicines.length; i++) {
medicines_fine.add(medicines[i]);
}
for (int i = 0; i < medicines_fine.size(); i++) {
keypair = medicines_fine.get(i).toString().split("=");
medicines_fine_name.add(keypair[0]);
System.out.println(keypair[0]);
System.out.println(keypair[1]);
medicines_fine_qty.add(keypair[1]);
}
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
CardLayout cl = (CardLayout) Parent.getLayout();
cl.show(Parent, "card3");
// SECOND DATABASE CONNECTION STARTS HERE ...
for (int i = 0; i < medicines_fine_name.size(); i++) {
try {
pst = medDbConn.prepareStatement("SELECT ID,SELLPRICE FROM MEDICINES WHERE NAME=?");
pst.setString(1, (String) medicines_fine_name.get(i));
rs = pst.executeQuery();
if (rs.next()) {
medicines_id.add(rs.getString("id"));
medicines_price.add(rs.getDouble("sellprice"));
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
for ( int i = 0; i < medicines_fine_name.size() ; i++) {
tblmodel.addRow(new Object[] {medicines_id.get(i),medicines_fine_name.get(i),medicines_price.get(i),medicines_fine_qty.get(i)});
}
}
如果删除了最后一个for循环,整个事情有时会毫无错误地运行。 (但这超出了目的)
是的,我说过#34;有时&#34; ..我非常困惑,你可以看到,这段代码是以非常丑陋的方式编写的。我用正常的方式写了它,但这个ArrayIndexOutOfBoundsException
让我重写了整个代码3次,最后我写的很糟糕&amp;丑陋的代码,但错误仍然挂在上面。
如果还有什么不清楚,请告诉我 编辑1:基本上我想要做的是从jlist中选择的字符串,使用split()函数分隔datetime部分和id部分并将它们存储到数组中。然后使用此ID和名称从数据库中选择药物。 &#34;药品&#34;是一个包含逗号分隔值的字符串,如Aspirin = 2,Amoxylin = 5,etc = 2,etc = 10其中= 10表示其中10个(表示数量。然后药物名称存储在arraylist中,而qty存入另一个。然后使用这个医药名称来获取medicine_id和sellprice。最后将所有这些都设置为一个表格。
答案 0 :(得分:0)
问题在于:
for ( int i = 0; i < medicines_fine_name.size() ; i++) {
tblmodel.addRow(new Object[] {medicines_id.get(i),medicines_fine_name.get(i),medicines_price.get(i),medicines_fine_qty.get(i)});
}
你在arraylist中迭代索引,其中没有元素存在。
你正在做的是你发出两个查询,在第一个查询中说你有10条记录。
现在在第二个查询中,您迭代10条记录(从第一个查询结果处理并传入arrayList)并在查询中触发10次。您可能会或可能不会获得记录,而且您可以:
if (rs.next()) {
medicines_id.add(rs.getString("id"));
medicines_price.add(rs.getDouble("sellprice"));
}
如果满分为10,那么你获得的药物大小为5,那么药物价格就会达到5。
现在是你的最后一个循环。在for循环中,您尝试按照第一个查询(medicines_fine_name.size())迭代MEDIC_id,medicines_fine_name,medicines_price,medicines_fine_qty,直到大小为10。
所以,当你进入索引6时,你试着继续说
medicines_id.get(6)
但是这个元素从未根据你的第二个查询填充,因此ArrayIndexOutOfBoundException。
要解决这个问题,一种方法是使用else部分将虚拟值填充到id和price,如下所示:
if (rs.next()) {
medicines_id.add(rs.getString("id"));
medicines_price.add(rs.getDouble("sellprice"));
} else {
medicines_id.add(rs.getString("9999"));
medicines_price.add(rs.getDouble("10.00"));
}