2013-02-16 94 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