Java,如何从另一个框架刷新一个框架中的JTable

问题描述:

因此,我有一个MainFrame类,其中有一个JTable,列出了存储在数据库中的所有产品。 JButton在侦听器的帮助下将打开AddProduct(另一个类和另一个窗口/框架),我可以在其中添加产品。不幸的是,一旦AddProduct添加新产品和自动关闭,我不确定如何在MainFrame中更新/重新验证JTable。 有些人可以给我一些想法,我该如何轻松解决这个问题?Java,如何从另一个框架刷新一个框架中的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

不确定要尝试什么。我的第二天曾经和gui一起工作过,所以我有点害怕,因为与我还没有做的其他程序相比,这只是一个小小的挫折。我用Google搜索了它,但大多数答案都没有帮助,或者我不知道如何实现它们。所以,当我问我应该从哪里开始。我不想找人为我编程,只是为了指点我。 – vedran 2012-03-20 11:18:52

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

+0

为什么在所有事情的名字中,你推荐使用静态任何东西?对不起,但这是可怕的建议。 -1票。 – 2012-03-21 14:37:32

您需要在JTable的模型的一部分工作,然后刷新,重新验证将工作。 试试看的JTable动态更新的一些例子像create TableModel and populate jTable dynamically

+2

再次:如果模型的行为您没有_need_(不重新刷新不刷新不重新验证)在_JTable_上执行任何操作... – kleopatra 2012-03-20 11:58:27

最简单的方法是在主类中的方法填充数据,并在您的actionPerformed方法,你正在处理添加新记录调用该方法后的表一个记录已被添加。这样,主类正在处理表模型的更新,而JTable的内部将处理表的重绘。如果添加记录成功,您甚至可以使用UpdateProducts中的方法仅更新表。

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

希望有助于一些。

+1

你可能意味着正确的事情,只是_main类正在处理... JTable_的重绘是错误的:表内部将触发所有必要的重绘(在Swing中重绘,btw) - 假设模型正在触发正确的事件DefaultTableModel是否 – kleopatra 2012-03-20 11:57:11

+0

感谢您的清除。我不太经常使用挥杆。 – ChadNC 2012-03-20 12:06:36