班级之间的关系

时间:2013-02-16 10:19:55

标签: java swing listener jbutton actionlistener

我很难将行添加到位于不同类中的表。

以下是类结构:

enter image description here 虚线箭头是我没有设置的理想关系

AddPanel类我有一个文件和Addbutton。

单击addButton时我首先创建一个Product实例(位于Logic Package中的类)。然后我需要在表中添加行(使用TableModel.AddRow方法)。

以下是GUI外观(焦点选项卡为AddPannel):

enter image description here

我尝试了不同的方法,但没有成功。

我的最后一次尝试是在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)

1 个答案:

答案 0 :(得分:3)

提供自定义事件和事件侦听器。如果您创建新产品,则触发事件并通知所有侦听器。 MainPanel(假设您创建AddPanel实例的位置)应该注册一个监听器。在此侦听器中,您可以更新表,因为MainPanel可以访问该表。

这也称为Mediator模式。

一些指示:

创建一个事件类,例如ProductCreatedEvent extends EventObject。将Product作为参数传递给构造函数,并使用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));