Java,如何从另一帧中刷新一帧中的JTable

所以我有一个MainFrame类,里面有一个JTable,列出了存储在DB中的所有产品。 JButton在监听器的帮助下将打开AddProduct(另一个类,另一个窗口/框架),我可以在其中添加产品。 不幸的是,一旦AddProduct添加了新产品和autocloses,我不确定如何在MainFrame中更新/重新validationJTable。 有些人可以给我一些想法,我怎么能轻易解决这个问题?

由于程序相当大,以下是它的相关部分:来自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 listInv = ps.getProductsByAtt(new ArrayList()); 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"); } } 

也许在AddProduct类中返回创建的Product的静态方法将解决您的问题。 看一下JOptionPane API,例如static String showInputDialog(Object message)

您需要处理JTable模型部件然后刷新,revalidate将起作用。 试试一些JTable动态更新的例子,比如创建TableModel并动态填充jTable

简单的方法是在主类中使用数据填充表,在actionPerformed方法中,在处理添加记录后添加新记录调用方法。 这样,主类处理表模型的更新,JTable的内部将处理表的重新绘制。 您甚至可以使用UpdateProducts中的方法仅在添加记录成功时更新表。

 public void actionPerformed(ActionEvent e) { UpdateProduct up = new UpdateProduct(); if(up.addRecord(ps.getProductByID(15))){ fillTable(); } } 

希望有所帮助。