所以我有一个MainFrame类,里面有一个JTable,列出了存储在DB中的所有产品。 JButton在监听器的帮助下将打开AddProduct(另一个类,另一个窗口/框架),我可以在其中添加产品。不幸的是,一旦AddProduct添加了新产品和autocloses,我不确定如何在MainFrame中更新/重新验证JTable。 有些人可以给我一些想法,我怎么能轻易解决这个问题?
由于程序相当大,以下是相关部分: 来自MainFrame.java
public JPanel tabProducts() {
JPanel panel = new JPanel(new MigLayout("","20 [grow, fill] 10 [grow, fill] 20", "20 [] 10 [] 20"));
/** Labels **/
JLabel label = new JLabel("List of all available products");
/** Buttons **/
JButton add = new JButton("Add product");
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new AddProduct();
}
});
JButton update = new JButton("Update product");
update.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new UpdateProduct(ps.getProductByID(15));
}
});
/** TABLE: Products **/
String[] tableTitle = new String[] {"ID", "Name", "Type", "Price", "In stock"};
String[][] tableData = null;
DefaultTableModel model = new DefaultTableModel(tableData, tableTitle);
JTable table = null;
/** Disable editing of the cell **/
table = new JTable(model){
public boolean isCellEditable(int r, int c) {
return false;
}
};
/** Load the products from DB **/
List<Product> listInv = ps.getProductsByAtt(new ArrayList<String>());
for (int i = 0; i < listInv.size(); i++) {
model.insertRow(i, new Object[] {
listInv.get(i).getID(),
listInv.get(i).getName(),
listInv.get(i).getType(),
listInv.get(i).getPrice(),
listInv.get(i).getQuantity()
});
}
/** Add scroll pane **/
JScrollPane scrollpane = new JScrollPane(table);
/** Add everything to the panel **/
panel.add(label, "wrap, span");
panel.add(scrollpane, "wrap, span");
panel.add(add);
panel.add(update);
return panel;
}
和AddProduct.java
public class AddProduct {
private JFrame frame;
private JButton add, cancel;
private JRadioButton food, beverage;
private JTextField name, price, quantity;
private IProductService ps = new ProductService();
private ButtonGroup group = new ButtonGroup();
private Product p;
private String type = "";
public AddProduct() {
/** Frame options **/
frame = new JFrame("Add new product");
frame.setSize(400, 280);
frame.setMinimumSize(new Dimension(400, 280));
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
/** Default panel **/
final JPanel panel = new JPanel(new MigLayout("","20 [grow, fill] 10 [grow, fill] 20", "20 [] 10 [] 20"));
/** Radio Buttons to choose between the food and the beverages **/
food = new JRadioButton("Food");
beverage = new JRadioButton("Beverage");
group.add(food);
group.add(beverage);
food.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
type = "Food";
frame.validate();
}
});
beverage.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
type = "Beverage";
frame.validate();
}
});
/** Add everything to the panel **/
panel.add(new JLabel("Product ID"));
panel.add(new JLabel(Integer.toString(ps.getProductNr()+1)), "wrap, span 2");
panel.add(new JLabel("Name"));
panel.add(name = new JTextField(""), "wrap, span 2");
panel.add(new JLabel("Type"));
panel.add(food);
panel.add(beverage, "wrap");
panel.add(new JLabel("Price"));
panel.add(price = new JTextField(""), "wrap, span 2");
panel.add(new JLabel("Quantity"));
panel.add(quantity = new JTextField(""), "wrap, span 2");
/** Button: ADD **/
add = new JButton("Add product");
add.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ( !type.equals("Food") && !type.equals("Beverage")) {
JOptionPane.showMessageDialog(panel, "Please choose the type of this product.");
} else if (name.getText().equals("")) {
JOptionPane.showMessageDialog(panel, "Please type a name for this product.");
} else if (price.getText().equals("")) {
JOptionPane.showMessageDialog(panel, "Please enter the price for this product.");
} else if (quantity.getText().equals("")) {
JOptionPane.showMessageDialog(panel, "Please enter the available amount of this product in stock.");
} else {
try {
p = new Product(ps.getProductNr()+1, name.getText(), type, Double.parseDouble(price.getText()), Integer.parseInt(quantity.getText()));
if (ps.addProduct(p)) {
JOptionPane.showMessageDialog(panel, "Product successfully added!");
frame.validate();
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}
} catch (Exception ex) {
addFinalError();
}
}
}
});
/** Button: CANCEL **/
cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING));
}
});
/** Add buttons to the panel **/
panel.add(cancel);
panel.add(add, "span 2");
/** Add panel to frame and make it visible **/
frame.add(panel);
frame.setVisible(true);
}
/**
* In case more then one error is encountered
*/
private void addFinalError(){
JOptionPane.showMessageDialog(frame, "An error occured while adding the product. Please make sure the following is correct:\n\n" +
" Name : Can contain letters and numbers\n" +
" Price : Must be a number\n" +
" Quantity : Must be a whole number\n");
}
}
答案 0 :(得分:1)
您需要处理JTable模型部件然后刷新,revalidate将起作用。 只需尝试一些JTable动态更新示例,例如create TableModel and populate jTable dynamically
答案 1 :(得分:0)
在AddProduct
类中返回创建的Product
的静态方法可能会解决您的问题。请查看JOptionPane API,例如static String showInputDialog(Object message)
答案 2 :(得分:0)
简单的方法是在主类中使用数据填充表,在actionPerformed方法中,在处理添加记录后添加新记录调用方法。这样主要类处理表模型的更新,JTable的内部将处理表的重新绘制。您甚至可以使用UpdateProducts中的方法仅在添加记录成功时更新表。
public void actionPerformed(ActionEvent e) {
UpdateProduct up = new UpdateProduct();
if(up.addRecord(ps.getProductByID(15))){
fillTable();
}
}
希望有所帮助。