2010-12-11 4 views
2

Je suis en train de faire mon projet de programmation de troisième année et c'est un tracker folio. :/J'ai crated interfaces Stock_API et Portfolio_API (et les mises en œuvre d'entre eux) et une classe de GUI qui, lorsque instancié prend deux paramètres comme autant:Java - Ajouter un objet à un arrayliste, puis ajouter un autre à l'arrayliste provoque l'écrasement du premier élément

public GUI(Portfolio_API p, Stock s){ 
     tempPort = p; 
     tempStock = s; 
} 

J'utilise ce constructeur comme un moyen d'obtenir les mises en œuvre de ces interfaces dans la Interface graphique sans exposer l'implémentation à l'interface graphique (qui est l'un des principaux objectifs de ce projet). Un objet portfolio a un nom (chaîne) et un ArrayList. Un objet de stock a un symbole ticker (chaîne), un nom de stock (chaîne), une valeur de partage (float), un nombre de partages (int) et une valeur de holding (float).

Dans l'interface graphique, j'ai une liste de portCollection qui contient des objets de type portfolio_API et permet au système de garder une trace de plusieurs portefeuilles. Aussi, comme mentionné dans le bloc de code ci-dessus a un objet tempStock et tempPort.

Désolé de vous donner autant de détails sur le programme, mais je le pensais mieux pour que je puisse comprendre le contexte. Quoi qu'il en soit, le problème à portée de main. J'ai une méthode qui utilise l'interface graphique pour obtenir un symbole boursier, un nom de stock et un nombre d'actions et ajoute le stock au portefeuille actuel ouvert (chaque portefeuille a son propre onglet). La méthode ressemble à ceci:

public void addStock() { 
    int num_shares = 0; 
    float dailyChange = 0.0f; 
    float stockValue = 0.0f; 
    boolean succeed = true; 

    // GUI gets information of stock from user 
    String ticker = JOptionPane.showInputDialog(frame, 
      "Enter the ticker symbol:"); 
    String stockName = JOptionPane.showInputDialog(frame, 
      "Enter the Stock name:"); 
    try { 
     num_shares = Integer.parseInt(JOptionPane.showInputDialog(frame, 
       "Enter the number of shares:")); 
    } catch (NumberFormatException e) { 
     JOptionPane.showMessageDialog(frame, 
       "Number of shares was not an integer. Try again"); 
     succeed = false; 
    } 

    // If parsing was successful... 
    if (succeed) { 
     tempStock.setTicker(ticker); 
     tempStock.setNumberOfShares(num_shares); 
     tempStock.setStockName(stockName); 

     // Fetches newest value using the current ticker symbol 
     boolean succeedUpdate = tempStock.updateShareValue(); 

     if (succeedUpdate) { 
      tempStock.calculateValueOfHolding(); 

      // Adds to the current portfolio... 
      String tabName = tabbedPane.getTitleAt(tabbedPane 
        .getSelectedIndex()); 
      System.out.println(tabName); 
      findPortfolio(tabName).addStock(tempStock); 
      findPortfolio(tabName).sort(); 

      // ...Then adds it to the table 
      JPanel j = (JPanel) tabbedPane.getSelectedComponent() 
        .getComponentAt(0, 0); 
      JViewport v = ((JScrollPane) j.getComponent(0)).getViewport(); 
      JTable table = (JTable) v.getComponent(0); 

      float currentTotal = findPortfolio(tabName).getTotal(); 

      // Updates the total label 
      ((JLabel) j.getComponent(1)).setText("Total: " + currentTotal); 

      Object[] newStock = { tempStock.getTicker(), 
        tempStock.getStockName(), 
        tempStock.getNumberOfShares(), 
        tempStock.getShareValue(), 
        tempStock.getValueOfHolding() }; 
      ((DefaultTableModel) table.getModel()).addRow(newStock); 
     } 
    } 
} 

Quand j'ajoute plus d'un stock, le nouveau stock a lieu de l'ancien efficacement un écrase. Je pense que c'est la réutilisation de tempStock qui le fait. Je ne sais pas pourquoi, mais aussi sûrement si j'ajoute la variable à un arraylist il devient une partie de cette liste et ne nécessite aucune association avec la variable tempStock.

Les méthodes qui sont utilisées avec les ArrayLists mentionnés:

private Portfolio_API findPortfolio(String name) { 
     Portfolio_API p = null; 
     for (int i = 0; i < portCollection.size(); i++) { 
      if (portCollection.get(i).getName() == name) { 
       p = portCollection.get(i); 
      } 
     } 

Ces deux sont dans la classe de portefeuille:

@Override 
public boolean addStock(Stock_API s) { 
    if (!doesExist(s)) { 
     portfolio.add(s); 
     return true; 
    } else { 
     return false; 
    } 

} 

@Override 
public boolean doesExist(Stock_API s) { 
    boolean found = false; 
    for (int i = 0; i < portfolio.size(); i++) { 
     if (portfolio.get(i).getTicker() == s.getTicker()) { 
      found = true; 
     } 
    } 
    return found; 
} 

Je suis venu ici que pour l'aide parce que je l'ai frappé un mur de briques et j'ai vraiment besoin d'aide. Si quelqu'un pouvait me donner des suggestions, je serais éternellement dans votre dette.

Merci, Chris

+4

Vous n'avez pas montré de code qui utilise un 'ArrayList', ce qui le rend difficile à cerner ... –

+0

Ah désolé, éditera le poste et ajouter quelques méthodes qui utilisent un arraylist. – ChrisMacDee

+3

Lorsque vous "ajoutez" un objet à une liste, vous ajoutez une référence à cet objet, et non une copie de l'objet. Si vous modifiez ultérieurement l'objet, toutes les références à cet objet verront ce changement. –

Répondre

3

Oui, je pense que vous avez raison quand vous dites que vous pensez que c'est parce que vous réutilisez la variable tempStock. Cette variable fait toujours référence à l'objet d'origine, l'appel setTicker() etc. sur tempStock modifie également l'objet référencé par votre ArrayList car il s'agit du même objet. Essayez votre tempStock et réinitialiser voir si cela fait une différence:

// If parsing was successful... 
    if (succeed) { 
     tempStock = new Stock(); // or however you instantiate this object 
     tempStock.setTicker(ticker); 
     tempStock.setNumberOfShares(num_shares); 
     tempStock.setStockName(stockName); 
+0

Je voudrais mais en re initialisant je devrais faire tempStock = new Stock(); mais cela exposerait l'implémentation à l'interface graphique:/Je souhaitais qu'il y ait un moyen de faire tempStock = new Stock_API() mais bien sur étant une interface, vous ne pouvez pas l'initier. – ChrisMacDee

+1

Vous pouvez surcharger 'addStock()' de la classe 'Portfolio' pour prendre les données boursières' addStock (ticker ticker, int numOfShares, nom de chaîne) 'et le construire là –

0

Merci les gars pour tous vos commentaires. Professeur certifié @oracle aidé avec les problèmes de stock après avoir ajouté une méthode surchargée pour addStock, mais a révélé les mêmes problèmes de portefeuille en proie.

Ce que j'ai fait était de créer une méthode makePortfolio dans Portfolio_API pour créer un nouveau portefeuille et le retourner. De cette façon, il évite tout écrasement désagréable, il va l'ajouter au stock juste maintenant.

Merci encore les gars. Bonne nuit! :)

Questions connexes