2013-02-16 123 views
1

我很難將行添加到位於不同類的表中。類之間的關係

以下是類結構:

enter image description here 虛線箭頭所期望的關係,我不管理有

AddPanel類我有一個的Fileds和Add按鈕。

單擊addButton時,我首先創建Product(位於Logic Package中的類)的實例。然後我需要添加行到表格中(使用TableModel.AddRow方法)。

以下是GUI外貌(聚焦選項卡AddPannel):

enter image description here

我嘗試不同approches但他們不被successed。

我最後的嘗試是在Table類創建以下方法:

public void AddRow(Product p) { 
    tbmStock.addRow(new Object[] { p.getExternalId(), p.getName(), 
      p.getAmount(), p.getPriceForMe(), p.getPriceForCustomer() }); 
} 

此外,在AddPanel類我嘗試添加下面的方法:

private void AddButtonAction() { 
    btnAddProduct.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
       try { 
       Product p = new Product(txtName.getText(), txtExternalID 
         .getText(), Integer.parseInt(txtAmount.getText()), 
         Double.parseDouble(txtPriceForMe.getText()), 
         Double.parseDouble(txtPriceForCustomer.getText()), 
         Integer.parseInt(txtFromYear.getText()), Integer 
           .parseInt(txtToYear.getText()), Integer 
           .parseInt(txtSupplier.getText()), Integer 
           .parseInt(txtCarType.getText())); 
       AddRow(p); //This call doesn't compiles 
      } 
      catch (Exception e1){ 
       JOptionPane.showMessageDialog(null,"Error"); 
      }  
     } 
    }); 

} 

有什麼建議? (實際上我甚至不確定我的結構是否良好:S)

+0

你可以簡單地表模型的引用添加到AddPanel – MadProgrammer 2013-02-16 10:27:21

+0

實際上「這不起作用「表示由於以下原因它不編譯:'AddRow(Product)方法是undefin編輯爲新的ActionListener類型(){}' – 2013-02-16 10:39:44

+0

@Gil Peretz在這種情況下,MadProgrammer大部分都是正確的,你需要在AddPanel中引用你的表,然後在你的ActionListener中調用table.AddRow()。不過,我建議創建一個自定義的'TableModel',它可以處理'Product'集合。 – annih 2013-02-16 10:50:10

回答

3

提供自定義事件和事件偵聽器。如果您創建新產品觸發事件並通知所有聽衆。 MainPanel(假設這是你創建AddPanel實例的地方),應該註冊一個監聽器。在這個監聽器中,您可以隨着MainPanel訪問表來更新表。

這也被稱爲介體模式。

一些指針:

創建事件類,例如ProductCreatedEvent extends EventObject。將產品作爲參數傳遞給構造函數,並使其可以通過getter訪問。

創建一個事件監聽器類:interface ProductCreatedEventListener extends EventListener。提供一個方法,如productCreated(ProductCreatedEvent productCreatedEvent)

在AddPanel添加類似:

private final List<ProductCreatedEventListener> productCreatedEventListeners = new ArrayList<>(); 
... 

public void addProductCreatedEventListener(ProductCreatedEventListener productCreatedEventListener){ 
    productCreatedEventListeners.add(productCreatedEventListener); 
} 

public void removeProductCreatedEventListener(ProductCreatedEventListener productCreatedEventListener){ 
    productCreatedEventListeners.remove(productCreatedEventListener); 
} 

private void fireProductCreatedEvent(ProductCreatedEvent event){ 
    for (ProductCreatedEventListener productCreatedEventListener : productCreatedEventListeners){ 
     productCreatedEventListener.productCreated(event); 
    } 
} 

替換:

AddRow(p); //This isn't working 

fireProductCreatedEvent(new ProductCreatedEvent(AddPanel.this, p)); 
+0

對不起,但我缺乏Java的期滿,你能給我一個例子或增強解決方案嗎? – 2013-02-16 10:32:36

+1

我已經添加了一些指向我的答案。試試看,並再問你是否有特定的問題。 – Puce 2013-02-16 10:45:49