【发布时间】: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 example 或Short, Self Contained, Correct Example。硬编码数据替换数据库。 2) 使用逻辑一致的缩进代码行和块的形式。缩进是为了让代码流更容易理解!大多数 IDE 都有专门用于格式化代码的键盘快捷键。 3) 请学习常见的 Java 命名法(命名约定 - 例如
EachWordUpperCaseClass、firstWordLowerCaseMethod()、firstWordLowerCaseAttribute,除非它是UPPER_CASE_CONSTANT)并始终如一地使用它。 -
这个问题太大了,你应该用一个能重现问题的 main 创建一些东西。 mysql 可以用列表中的固定数据替换。或者,对 modelTable 进行一些调试。调用getColumnCount()和getRowCount(),与运行时使用的值对比如何?
标签: java mysql swing arraylist jtable