我很难将行添加到位于不同类的表中。
类结构如下:
虚线箭头是我无法拥有的理想关系
在 AddPanel
类中,我有一个文件和 Addbutton。
单击 addButton 时,我首先创建了一个 Product 实例(位于逻辑包中的类)。然后我需要向表中添加行(使用 TableModel.AddRow
方法)。
以下是 GUI 外观(焦点选项卡是 AddPannel
):
我尝试了不同的方法,但没有一个成功。
我最后一次尝试是在 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/