我正在尝试创建一个AbstractTableModel,而不是三个。应用程序使用MVC架构,因此控制器将更新模型。我对如何做列名、创建一个空列表和setValueAt方法有点困惑。列名和数据应该是静态ArrayList吗?setValueAt方法目前是使用Switch语句来完成的,但是使用数组的ArrayList可以更容易地完成吗?控制器可以从tableModel调用一个方法来清空列表,然后该方法将执行fireTableDataChanged()。目标是可重用性,并在学习时遵循良好的编码实践。
发布于 2015-06-26 09:45:50
我决定做两张表,并且我能够组合两张表。
package model;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumnModel;
import model.common.Order;
import model.common.Product;
public class OrderTableModel extends AbstractTableModel {
private List<Order> orderList;
private String[] columnNames = { "Product ID", "Description",
"Supplier ID", "Order Quantity", "Unit of Measure", "Total Cost",
"Order Date" };
public OrderTableModel(ArrayList<Order> orderList) {
this.orderList = orderList;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "<html>Product ID</html>";
case 1:
return "<html>Description</html>";
case 2:
return "<html>Supplier ID</html>";
case 3:
return "<html>Order<br></br>Quantity</html>";
case 4:
return "<html>Unit of<br></br>Measure</html>";
case 5:
return "<html>Total<br></br>Cost</html>";
case 6:
return "<html>Order<br></br>Date</html>";
default:
return null;
}
}
@Override
public int getRowCount() {
return orderList.size();
}
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
@Override
public Object getValueAt(int row, int column) {
Order order = (Order) orderList.get(row);
switch (column) {
case 0:
return order.getProduct().getId();
case 1:
return order.getProduct().getProductDescription();
case 2:
return order.getSupplier().getId();
case 3:
return order.getProduct().getOrderQty();
case 4:
return order.getProduct().getUOM();
case 5:
return order.getTotalCost();
case 6:
return order.getDate();
}
}
}另一个表格模型。
package model;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import model.common.Product;
public class ProductTableModel extends AbstractTableModel {
private List<Product> productList;
private String[] columnNames = { "ID", "Description", "Inventory",
"Minimum Quantity", "Cost", "Order Quantity" };
public ProductTableModel() {
productList = new ArrayList<Product>();
}
public ProductTableModel(ArrayList<Product> productList) {
this.productList = productList;
}
public void resetTable() {
productList.clear();
fireTableDataChanged();
}
public void createEmptyTable() {
while (productList.size() <= 12) {
productList.add(new Product("", "", 0, 0, 0, 0));
}
}
public void addRow(Product product) {
productList.add(product);
fireTableRowsInserted(productList.size() - 1, productList.size() - 1);
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "<html>ID<br></html>";
case 1:
return "<html>Description<br></html>";
case 2:
return "<html>Inventory<br></html>";
case 3:
return "<html>Minimum<br>Quantity</html>";
case 4:
return "<html>Cost<br></html>";
case 5:
return "<html>Order<br>Quantity</html>";
default:
return null;
}
}
@Override
public int getRowCount() {
return productList.size();
}
@Override
public boolean isCellEditable(int row, int column) {
return true;
}
@Override
public Object getValueAt(int row, int column) {
Product product = productList.get(row);
switch (column) {
case 0:
return product.getId();
case 1:
return product.getProductDescription();
case 2:
return product.getQtyOnHand();
case 3:
return product.getMinQty();
case 4:
return product.getCost();
case 5:
return product.getOrderQty();
default:
throw new IndexOutOfBoundsException();
}
}
@Override
public void setValueAt(Object value, int row, int column) {
Product product = productList.get(row);
switch (column) {
case 0:
product.setId((String) value);
break;
case 1:
product.setProductDescription((String) value);
break;
case 2:
product.setQtyOnHand((int) value);
break;
case 3:
product.setMinQty((int) value);
break;
case 4:
product.setCost((double) value);
break;
case 5:
product.setOrderQty((int) value);
break;
default:
throw new IndexOutOfBoundsException();
}
fireTableCellUpdated(row, column);
}
}https://stackoverflow.com/questions/30881738
复制相似问题