簡體   English   中英

如何使用ArrayList在Java Jtable中顯示來自mysql表的所有數據?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM