2012-03-20 21 views
1

したがって、JTableを持つMainFrameクラスがあり、DBに格納されているすべての商品がリストされています。リスナーの助けを借りてJButtonはAddProduct(別のクラスと別のウィンドウ/フレーム)を開き、DBに商品を追加することができます。残念ながら、AddProductが新製品と自動クローゼスを追加すると、MainFrameのJTableをどのように更新/再検証できるのかよく分かりません。 どうすれば簡単に解決できますか?Java、別のフレームから1つのフレームでJTableを更新する方法

プログラムは、ここでは、かなり大きいので、それの関連する部分です:あなたは、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

何を試していいのか分かりません。私の2日目はguiと一緒に働いていたので、私はまだ気にしていません。なぜなら、これは私がまだやっていない残りのプログラムと比べてほんの少しの後退だからです。私はそれをgoogled、しかし答えのほとんどは役に立たなかったか、私はそれらを実装する方法を知らなかった。だから、私はどこから始めるべきか尋ねた。私はちょうど正しい方法で私を指すために私のためにプログラムする人を探しているわけではありません。 – vedran

答えて

0

あなたの問題を解決します作成したProductを返しAddProductクラスの静的メソッドのようにJTableの動的更新のいくつかの例を試してみてください。例えばJOptionPane APIを見てみましょうstatic String showInputDialog(Object message)

+0

なぜ、すべてのものの名前に、静的なものを使用することをお勧めしますか?申し訳ありませんが、これはひどいアドバイスです。 -1票。 –

1

からとリフレッシュすると、revalidateが機能します。 もしかしたらcreate TableModel and populate jTable dynamically

+2

もう一度:モデルが振る舞う場合、_Jeedable上で何かを行うために、_need_(再塗り替えしないで再検証しないでください)を実行しないでください。 – kleopatra

0

簡単な方法は、データと、あなたは新しいレコードが後にそのメソッドを呼び出す追加処理しているあなたの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

+0

ありがとうございます。私はスイングをあまり頻繁に使用することはありません。 – ChadNC

関連する問題