连接到 JDBC 时使用 getColumnClass() 对 JTable 进行排序
sorting a JTable using getColumnClass() when connected to JDBC
我花了几天时间试图让我的 JTable 正确排序。我知道我必须使用的代码,但似乎无法为 'fit' 获取它并在我的代码中工作。我从数据库中获取 TableModel 数据,所以如果我在初始化模型时调用 getColumnClass(),我会得到一个 NullPointerException(当然),但我似乎无法让 getColumnClass(int) 在其他任何地方工作,例如model.getColumnClass(列索引)。我只需要按数字顺序对第一列进行排序,因为其余的都是字符串。这是我的代码。 (ps:这是第一次使用 JBDC,所以我很可能在调用顺序上有错误 - 或者可能在 'longhand' 哈哈)
public JTable memberList()
{
JTable jTable1;
DefaultTableModel model;
model = new DefaultTableModel();
jTable1 = new JTable(model);
TableRowSorter sorter = new TableRowSorter(model);
try
{
Statement stmt = conn.createStatement();
String sql = "select rm.race_no,cm.firstname,cm.lastname,cm.phone,cm.dob,cm.email,cm.TwinTown_ID,rm.disqualified,cm.notes\n" +
"from competitor_master cm join competitor_season cs on cm.competitor_id = cs.competitor_id\n" +
"inner join race_master rm on cs.race_no= rm.race_no where cm.twintown_id is not null and cs.season_start_year in (year(sysdate()))\n" +
"group by (race_no);";
ResultSet rs = stmt.executeQuery(sql);
String b = "", c = "", d = "", e = "", f = "", g = "", h = "", i = "";
int a;
model.addColumn("Member Number");
model.addColumn("First Name");
model.addColumn("Last Name");
model.addColumn("Phone");
model.addColumn("Date of Birth");
model.addColumn("Email");
model.addColumn("TT Member Number");
model.addColumn("Disqualified");
model.addColumn("Notes");
while(rs.next())
{
a = rs.getInt(1);
b = rs.getString("FirstName");
c = rs.getString("LastName");
d = rs.getString("phone");
e = rs.getString("dob");
f = rs.getString("email");
g = rs.getString("TwinTown_ID");
h = rs.getString("disqualified");
i = rs.getString("notes");
model.addRow(new Object[] {a,b,c,d,e,f,g,h,i});
model.getColumnClass(1);
}
stmt.close();
rs.close();
}
catch (SQLException ex)
{
}
jTable1.getTableHeader().setFont(new Font("Microsoft Tai Le", Font.BOLD, 14));
jTable1.getTableHeader().setBackground(Color.WHITE);
jTable1.getTableHeader().setForeground(new Color(234, 168, 82));
jTable1.getTableHeader().setBorder(null);
jTable1.setRowSorter(sorter);
return jTable1;
}
public Class getColumnClass (int column){
if (column==1) {
return(Integer.class);
}
return(String.class);
}
it is sorting but by the first number only. so is sorting like this: 123 17 22 28 45 5 56 66
因为它将所有数据都视为字符串数据。
model = new DefaultTableModel();
jTable1 = new JTable(model);
您正在使用 DefaultTableModel 和 JTable 的默认实现。 getColumnClass(...)
方法的默认实现只是 returns Object.class 所以每个对象的 toString() 值被排序。
您不手动调用 getColumnClass() 方法,您需要重写 TableModel
的 getColumnClass(...)
方法:
model = new DefaultTableModel()
{
@Override
public Class getColumnClass (int column)
{
return (column == 0) ? Integer.class : String.class;
}
};
我花了几天时间试图让我的 JTable 正确排序。我知道我必须使用的代码,但似乎无法为 'fit' 获取它并在我的代码中工作。我从数据库中获取 TableModel 数据,所以如果我在初始化模型时调用 getColumnClass(),我会得到一个 NullPointerException(当然),但我似乎无法让 getColumnClass(int) 在其他任何地方工作,例如model.getColumnClass(列索引)。我只需要按数字顺序对第一列进行排序,因为其余的都是字符串。这是我的代码。 (ps:这是第一次使用 JBDC,所以我很可能在调用顺序上有错误 - 或者可能在 'longhand' 哈哈)
public JTable memberList() { JTable jTable1; DefaultTableModel model; model = new DefaultTableModel(); jTable1 = new JTable(model); TableRowSorter sorter = new TableRowSorter(model); try { Statement stmt = conn.createStatement(); String sql = "select rm.race_no,cm.firstname,cm.lastname,cm.phone,cm.dob,cm.email,cm.TwinTown_ID,rm.disqualified,cm.notes\n" + "from competitor_master cm join competitor_season cs on cm.competitor_id = cs.competitor_id\n" + "inner join race_master rm on cs.race_no= rm.race_no where cm.twintown_id is not null and cs.season_start_year in (year(sysdate()))\n" + "group by (race_no);"; ResultSet rs = stmt.executeQuery(sql); String b = "", c = "", d = "", e = "", f = "", g = "", h = "", i = ""; int a; model.addColumn("Member Number"); model.addColumn("First Name"); model.addColumn("Last Name"); model.addColumn("Phone"); model.addColumn("Date of Birth"); model.addColumn("Email"); model.addColumn("TT Member Number"); model.addColumn("Disqualified"); model.addColumn("Notes"); while(rs.next()) { a = rs.getInt(1); b = rs.getString("FirstName"); c = rs.getString("LastName"); d = rs.getString("phone"); e = rs.getString("dob"); f = rs.getString("email"); g = rs.getString("TwinTown_ID"); h = rs.getString("disqualified"); i = rs.getString("notes"); model.addRow(new Object[] {a,b,c,d,e,f,g,h,i}); model.getColumnClass(1); } stmt.close(); rs.close(); } catch (SQLException ex) { } jTable1.getTableHeader().setFont(new Font("Microsoft Tai Le", Font.BOLD, 14)); jTable1.getTableHeader().setBackground(Color.WHITE); jTable1.getTableHeader().setForeground(new Color(234, 168, 82)); jTable1.getTableHeader().setBorder(null); jTable1.setRowSorter(sorter); return jTable1; }
public Class getColumnClass (int column){ if (column==1) { return(Integer.class); } return(String.class); }
it is sorting but by the first number only. so is sorting like this: 123 17 22 28 45 5 56 66
因为它将所有数据都视为字符串数据。
model = new DefaultTableModel();
jTable1 = new JTable(model);
您正在使用 DefaultTableModel 和 JTable 的默认实现。 getColumnClass(...)
方法的默认实现只是 returns Object.class 所以每个对象的 toString() 值被排序。
您不手动调用 getColumnClass() 方法,您需要重写 TableModel
的 getColumnClass(...)
方法:
model = new DefaultTableModel()
{
@Override
public Class getColumnClass (int column)
{
return (column == 0) ? Integer.class : String.class;
}
};