//下面是我的table
class Store_table
{
Object data[][];
Object name[]={"商品编号","商品名称","价格","上架日期","保质日期","库存"};
Store_table(String bq)
{
String url = "jdbc:sqlserver://127.0.0.1:1433;databaseName=Store;IntegratedSecurity=True";//
// Declare the JDBC objects.
Connection con=null;
Statement sql=null;
ResultSet rs=null;
try {
// Establish the connection.
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = DriverManager.getConnection(url);
sql = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs = sql.executeQuery("SELECT * FROM 仓库 where 标签='"+bq+"'");
rs.last();
data=new Object[rs.getRow()][6];
// Iterate through the data in the result set and display it.
int i=0;
rs.beforeFirst();
while (rs.next()) {
long number=rs.getLong("商品编号");
String name=rs.getString("商品名称");
float price=rs.getFloat("价格");
Date date=rs.getDate("上架日期");
int staydate=rs.getInt("保质日期");
int repertory=rs.getInt("库存");
data[i][0]=number;
data[i][1]=name;
data[i][2]=price;
data[i][3]=date;
data[i][4]=staydate;
data[i][5]=repertory;
i++;
}
}
// Handle any errors that may have occurred.
catch (Exception e) {
e.printStackTrace();
}
finally {
if (rs != null)
try {
rs.close();
} catch (Exception e) {
}
if (sql != null)
try {
sql.close();
} catch (Exception e) {
}
if (con != null)
try {
con.close();
} catch (Exception e) {
}
}
}
}
//我用JComboBox调用和更新JTable
public void actionPerformed(ActionEvent arg0) {
String a=comboBox.getSelectedItem().toString();
store=new Store_table(a);
//把store放进JTable
ta=new JTable(store.data,store.name)
{
public boolean isCellEditable(int row, int column) {return false;};//设置列表数据不能修改
};
//把ta列表放进滚动列表
ta.setModel(model);
JScrollPane jsp=new JScrollPane(ta);
//JScrollPane jsp=new JScrollPane(store);
//getContentPane().add(jsp,BorderLayout.CENTER);
ta.setBackground(Color.ORANGE);
jsp.setBackground(Color.GRAY);
//jsp.setBackground(Color.ORANGE);
contentPane.add(jsp);
jsp.setBounds(0, 41, 743, 252);
}
});
怎么让JTable在JComboBox改动的时候更新呢?
据说需要setModel 再repaint 再updateUI
可是具体怎么做呢?
table不用每次都重新new一个,每次刷新用的都是同一个table, 所以new Jtable是在JComboBox的actionPerformed()之外,在动作之内只需更新table的model并repaint和updateUI. 你可以每次刷新都新建一个model:
DefaultTableModel model=new DefaultTableModel(store.data, store.name);
table.setModel(model);
table.repaint();
table.updateUI();
或者新建一个model类,在Store_table(String bq)里面将数据用list的方式保存:
public class StoreTableModel extends AbstractTableModel{
private String[] names = {"商品编号","商品名称","价格","上架日期","保质日期","库存"};
private List<Object> list = new ArrayList<Object>();
public StoreTableModel() {
}
public void setRowData(List list) {
this.list = list;
fireTableDataChanged();
}
@Override
public int getRowCount() {
if(list.isEmpty())
return -1;
return list.size();
}
@Override
public int getColumnCount() {
return names.length;
}
@Override
public String getColumnName(int columnIndex) {
return names[columnIndex];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (!list.isEmpty()) {
return list.get(rowIndex)[columnIndex];
}
return null;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
}