2013-02-16 5 views
1

Je rencontre des difficultés pour ajouter des lignes à une table située dans une classe différente.relations entre les classes

Suite sont la structure classes:

enter image description here La flèche en pointillés est la relation souhaitée que je nai réussi à avoir

dans la classe AddPanel J'ai fileds et addButton. Lorsque vous cliquez sur le bouton addButton, je crée d'abord une instance de Product (classe située dans Logic Package) lorsque vous cliquez sur le bouton addButton.

Ensuite, j'ai besoin d'ajouter une ligne à la table (en utilisant la méthode TableModel.AddRow).

Après sont les GUI (Looks l'onglet ciblé est AddPannel):

enter image description here

j'ai essayé différentes approaches mais non d'entre eux ont été successed.

Ma dernière tentative était de créer dans la classe Table la méthode suivante:

public void AddRow(Product p) { 
    tbmStock.addRow(new Object[] { p.getExternalId(), p.getName(), 
      p.getAmount(), p.getPriceForMe(), p.getPriceForCustomer() }); 
} 

En outre, dans la AddPanel classe I essayé d'ajouter la méthode suivante:

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"); 
      }  
     } 
    }); 

} 

Toutes les suggestions? (en fait je ne suis pas sûr que même ma structure soit bonne: S)

+0

Vous pouvez simplement ajouter une référence du modèle de table à la AddPanel – MadProgrammer

+0

fait " Cela ne fonctionne pas "signifie qu'il ne compile pas en raison de ce qui suit:' La méthode AddRow (Product) est undefin ed pour le nouveau type ActionListener() {} ' –

+0

@Gil Peretz dans ce cas MadProgrammer est pour la plupart correct, vous avez besoin d'une référence à votre table dans' AddPanel' et ensuite appelez 'table.AddRow()' dans votre 'ActionListener'. Encore je recommande de créer un 'TableModel' personnalisé qui est capable de gérer une collection de' Product'. – annih

Répondre

3

Fournir un écouteur d'événement et d'événement personnalisé. Si vous créez un nouveau produit, déclenchez l'événement et avertissez tous les auditeurs. Le MainPanel (en supposant que vous créez l'instance de AddPanel), devrait enregistrer un écouteur. Dans cet écouteur vous pouvez alors mettre à jour la table car MainPanel a accès à la table.

Ceci est également connu sous le nom de modèle Mediator.

Quelques pointeurs:

Créer une classe d'événements, par exemple ProductCreatedEvent extends EventObject. Passez le produit en tant qu'argument au constructeur et rendez-le accessible avec un getter.

Créer une classe d'écouteur d'événement: interface ProductCreatedEventListener extends EventListener. Fournissez une méthode telle que productCreated(ProductCreatedEvent productCreatedEvent).

Dans les AddPanel ajouter quelque chose comme:

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); 
    } 
} 

Remplacer:

AddRow(p); //This isn't working 

avec

fireProductCreatedEvent(new ProductCreatedEvent(AddPanel.this, p)); 
+0

Je suis désolé mais je manque d'expiriance en Java, pouvez-vous me donner un exemple ou une amélioration de la solution? –

+1

J'ai ajouté quelques pointeurs à mes réponses. Essayez-le et demandez à nouveau si vous avez des questions spécifiques. – Puce

Questions connexes