[英]How to show all data from a mysql table in a Java Jtable with ArrayList?
我試圖用Mysql:City表中的所有數據填充JTable。
我有一個名為City的類,它具有City的方法和屬性,這是其代碼:
package mainDashboard;
public class City{
private int id;
private String name;
public City(){
}
public City(String name){
this.id = id;
this.name= name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name= name;
}
@Override
public String toString() {
return this.id+", "+this.name;
}
}
我還有一個名為CityModel的類,其中具有所有必要的方法來保存數據,更新數據,刪除數據以及從“城市”表中提取數據。
我有一個問題,要從城市表中提取所有數據並顯示它們。 因此,我將僅顯示CityModel類中的ListDataCity方法:
public ArrayList ListDataCity() {
ArrayList DataCity= new ArrayList();
City t_a = new City();
int Id_Element = 0;
sSQL = "SELECT * FROM city_data";
try {
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sSQL);
while (rs.next()) {
Id_Element = Integer.parseInt(rs.getString("id"));
t_a.setId(Id_Element);
t_a.setName(rs.getString("city_name"));
DataCity.add(t_a);
}
return DataCity;
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
return null;
}
}
我將這些數據顯示在JFrame的ShowCityAll類的表中。 當我按ShowDataCity按鈕時,所有數據都必須加載到表中。 這是我的代碼:
private void ShowDataCityActionPerformed(java.awt.event.ActionEvent evt) {
Object CityObj[] = null;
modelTable.addRow(CityObj);
ArrayList Results = new ArrayList();
CityModel Db_ListCity;
Db_ListCity= new CityModel();
Results = Db_ListCity.ListDataCity();
for (int i = 0; i < Results.size(); i++)
{
City dataCityT = (City) Results.get(i);
modelTable.setValueAt(dataCityT.getId(), i, 0); modelTable.setValueAt(dataCityT.getName(), i, 1);
}
}
這是Table元素的代碼:
DefaultTableModel modelTable;
private void CreateModelShowCity(){
try {
modelTable= (new DefaultTableModel(
null, new String [] {
"ID","City Name"}){
Class[] types = new Class [] {
java.lang.String.class,
java.lang.String.class
};
boolean[] canEdit = new boolean [] {
false,false
};
@Override
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int colIndex){
return canEdit [colIndex];
}
});
jTableShowCity.setModel(modelTable);
jTableShowCity.getColumnModel().getColumn(0).setPreferredWidth(50);
jTableShowCity.getColumnModel().getColumn(0).setMaxWidth(150);
} catch (Exception e) {
JOptionPane.showMessageDialog(null,e.toString()+"error2");
}
}
mysql中的city表現在有六個記錄。 問題是僅顯示最后一條記錄。 我想顯示表中的所有記錄,而不僅僅是最后一個。
當我按下按鈕時,還會顯示下一個錯誤:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
at java.util.Vector.elementAt(Vector.java:477)
at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:664)
at mainDashboard.ShowCityAll.ShowDataCityActionPerformed(ShowCityAll.java:1523)
at mainDashboard.ShowCityAll.access$100(ShowCityAll.java:18)
at mainDashboard.ShowCityAll$2.actionPerformed(ShowCityAll.java:223)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2238)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2296)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4897)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4534)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4475)
at java.awt.Container.dispatchEventImpl(Container.java:2282)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:733)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
你能幫我解決這個問題嗎? 我從Java開始,這是我的第一個項目。
簡要查看之后,這可能是您的問題:
while (rs.next()) {
Id_Element = Integer.parseInt(rs.getString("id"));
t_a.setId(Id_Element);
t_a.setName(rs.getString("city_name"));
DataCity.add(t_a);
}
嘗試將創建一個新的City
移入代碼的這一部分,以使您不僅在重用同一object
。
像這樣:
while (rs.next()) {
City t_a = new City();
Id_Element = Integer.parseInt(rs.getString("id"));
t_a.setId(Id_Element);
t_a.setName(rs.getString("city_name"));
DataCity.add(t_a);
}
以這種方式考慮,您只有一個City
並且只是在更改其名稱和ID。 您實際上必須創建一個新的City
才能將這些值設置為。
另外,您可能應該使用ArrayList<City>
而不是ArrayList
,這通常不是一個好習慣。
在現實世界中,另一個好的做法是在Statement
中也使用PreparedStatement
,因為Statement
是一個安全漏洞,易於SQL注入,因此研究它們可能是明智的。
編輯:
我懷疑您可能沒有足夠的行/列聲明了modelTable
,可以這樣做:
DefaultTableModel modelTable = new DefaultTableModel(6, 2);
或對於JTable
JTable modelTable = new JTable(6, 2);
這將創建一個具有6行2列的modelTable
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.