【问题标题】:How to show all data from a mysql table in a Java Jtable with ArrayList?如何使用 ArrayList 在 Java Jtable 中显示 mysql 表中的所有数据?
【发布时间】:2019-08-05 19:11:22
【问题描述】:

我正在尝试用 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 的类,其中我拥有保存数据、更新数据、删除数据和从 City 表中提取数据的所有必要方法。

我有问题从城市表中提取所有数据并显示它们。出于这个原因,我将只展示 Class 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);
        }        
 }

这是表格元素的代码:

 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表现在有6条记录。问题是只显示最后一条记录。我想显示表中的所有记录,而不仅仅是最后一条。

按下按钮时也会显示下一个错误:

         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开始,这是我的第一个项目。

【问题讨论】:

  • TableModel 的数据应该存储在 TableModel 中。这意味着 ArrayList 应该是自定义 TableModel 中的实例变量。要为您的 City 对象创建自定义 TableModel,请参阅 [Row Table Model](),了解如何执行此操作的分步示例。
  • 1) 为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。硬编码数据替换数据库。 2) 使用逻辑一致的缩进代码行和块的形式。缩进是为了让代码流更容易理解!大多数 IDE 都有专门用于格式化代码的键盘快捷键。 3) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。
  • 这个问题太大了,你应该用一个能重现问题的 main 创建一些东西。 mysql 可以用列表中的固定数据替换。或者,对 modelTable 进行一些调试。调用getColumnCount()和getRowCount(),与运行时使用的值对比如何?

标签: java mysql swing arraylist jtable


【解决方案1】:

简单查看后,这可能是您的问题:

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&lt;City&gt; 而不是ArrayList,这通常不是一个好习惯。

另一个好的做法是在实际场景中使用PreparedStatement 而不是Statement,因为Statement 是一个安全漏洞并且容易发生SQL 注入,因此调查它们可能是明智的。

编辑:

我怀疑您可能已经声明了您的modelTable,但没有足够的行/列,可以这样做:

DefaultTableModel modelTable = new DefaultTableModel(6, 2);

JTable

JTable modelTable = new JTable(6, 2);

这将创建一个有 6 行和 2 列的modelTable

【讨论】:

  • 感谢您的回答。我做了这个改变,但它仍然是同样的问题,因为现在只显示表 City 的第一条记录。表格 City 有 6 条记录:1. 纽约,2. 迈阿密,3. 亚特兰大,4. 奥兰多,5. 费城,6. 渥太华。但现在在 Jtable 上显示的唯一数据是 1. 纽约。
  • @Marcos Schmell 您能展示一下您是如何创建modelTable 的吗?我对我怀疑可能是问题的地方进行了编辑,但您没有在此处发布该信息。
  • 我添加了用于创建模型表的代码
猜你喜欢
  • 2013-12-18
  • 1970-01-01
  • 2017-06-07
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2020-10-02
  • 1970-01-01
相关资源
最近更新 更多