java - 类之间的关系

标签 java swing listener jbutton actionlistener

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

类结构如下:

enter image description here 虚线箭头是我无法拥有的理想关系

AddPanel 类中,我有一个文件和 Addbutton。

单击 addButton 时,我首先创建了一个 Product 实例(位于逻辑包中的类)。然后我需要向表中添加行(使用 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 )

最佳答案

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

这也称为中介者模式。

一些提示:

创建一个事件类,例如ProductCreatedEvent 扩展了 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));

关于java - 类之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909208/

相关文章:

java - 为什么 if (variable1 % variable2 == 0) 效率低下?

java - 列表项 = new ArrayList() : it does not work

java - Netbeans:如何动态填充 JTree?

java - 鼠标监听器不监听

java - Thymeleaf 计数每个循环中的匹配项(对象数组)

java - 如何将流从一个线程传递到另一个线程?也许我应该采取不同的做法?

java - Java 中的 ByteBuffer 字节填充

java - 如何知道 JTable 何时已排序

Java Swing, JComboBox 下拉列表点击前改变监听器

java - 为什么调用 fireTableDataChanged() 方法时我的 ListSelectionListener 总是被触发