Java 阶级关系

Java 阶级关系,java,swing,listener,jbutton,actionlistener,Java,Swing,Listener,Jbutton,Actionlistener,我很难将行添加到位于不同类中的表中 以下是课程结构: 虚线箭头是我无法获得的理想关系 在AddPanel类中,我有一个fileds和Addbutton 单击addButton时,我首先创建Product(位于逻辑包中的类)的实例。然后我需要将行添加到表中(使用TableModel.AddRow方法) 以下是GUI外观(焦点选项卡为AddPannel): 我尝试了不同的方法,但没有一种成功 我最后一次尝试是在表中创建以下方法: public void AddRow(Product p) {

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

以下是课程结构:

虚线箭头是我无法获得的理想关系

AddPanel
类中,我有一个fileds和Addbutton

单击addButton时,我首先创建Product(位于逻辑包中的类)的实例。然后我需要将行添加到表中(使用
TableModel.AddRow
方法)

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

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

我最后一次尝试是在
表中创建以下方法:

public void AddRow(Product p) {
    tbmStock.addRow(new Object[] { p.getExternalId(), p.getName(),
            p.getAmount(), p.getPriceForMe(), p.getPriceForCustomer() });
}
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");
            }       
        }
    });

}
此外,在
AddPanel
类中,我尝试添加以下方法:

public void AddRow(Product p) {
    tbmStock.addRow(new Object[] { p.getExternalId(), p.getName(),
            p.getAmount(), p.getPriceForMe(), p.getPriceForCustomer() });
}
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)

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

这也称为中介模式

一些指针:

创建一个事件类,例如,
ProductCreatedEvent扩展了EventObject
。将产品作为参数传递给构造函数,并使用getter使其可访问

创建事件侦听器类:
接口ProductCreatedEventListener扩展了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);
    }
}


您可以简单地将表模型的引用添加到AddPanel实际上“这不起作用”意味着由于以下原因它不会编译:
方法AddRow(Product)对于类型new ActionListener(){}
@Gil Peretz在这种情况下,程序员基本上是正确的,您需要在
AddPanel
中引用表,然后在
ActionListener
中调用
table.AddRow()
。尽管如此,我还是建议创建一个定制的
表格模型
,它能够处理
产品的集合
。很抱歉,我在Java中没有过期性,你能给我一个示例或解决方案的增强吗?我已经为我的答案添加了一些指针。尝试一下,如果你有具体的问题,再问一次。