2010-06-10 5 views
5

Je rencontre des problèmes avec l'idée d'accéder à des variables d'autres classes. J'ai eu un poste ici: Having access to a private variable from other classes in Java où j'ai reçu des informations utiles, et j'ai pensé qu'un exemple serait mieux de le montrer, et poser une autre question. J'ai un formulaire dans lequel je peux entrer des données, et il a une variable de liste. Je ne l'ai pas rendu statique au début, mais je pensais que si je devais obtenir la taille totale d'une autre classe, je ne créerais pas une instance de cette classe pour utiliser la fonction getTotalContacts. Je veux fondamentalement mettre à jour ma barre d'état avec le nombre total de contacts qui sont dans ma liste. Un des membres a dit dans le post ci-dessus d'utiliser le membre original de Foo pour obtenir les contacts, mais je ne suis pas sûr de savoir comment cela fonctionne dans ce cas. Toute réflexion sera apprécié. Merci.Utilisation de getters/setters en Java

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.util.List; 
import java.util.ArrayList; 

public class AddressBook 
{ 
    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       AddressBookFrame frame = new AddressBookFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

       JMenuBar menuBar = new JMenuBar(); 
       frame.setJMenuBar(menuBar); 

       JMenu fileMenu = new JMenu("File"); 
       JMenuItem openItem = new JMenuItem("Open"); 
       JMenuItem saveItem = new JMenuItem("Save"); 
       JMenuItem saveAsItem = new JMenuItem("Save As"); 
       JMenuItem printItem = new JMenuItem("Print"); 
       JMenuItem exitItem = new JMenuItem("Exit"); 
       fileMenu.add(openItem); 
       fileMenu.add(saveItem); 
       fileMenu.add(saveAsItem); 
       fileMenu.add(printItem); 
       fileMenu.add(exitItem); 
       menuBar.add(fileMenu); 

       JMenu editMenu = new JMenu("Edit"); 
       JMenuItem newItem = new JMenuItem("New"); 
       JMenuItem editItem = new JMenuItem("Edit"); 
       JMenuItem deleteItem = new JMenuItem("Delete"); 
       JMenuItem findItem = new JMenuItem("Find"); 
       JMenuItem firstItem = new JMenuItem("First"); 
       JMenuItem previousItem = new JMenuItem("Previous"); 
       JMenuItem nextItem = new JMenuItem("Next"); 
       JMenuItem lastItem = new JMenuItem("Last"); 
       editMenu.add(newItem); 
       editMenu.add(editItem); 
       editMenu.add(deleteItem); 
       editMenu.add(findItem); 
       editMenu.add(firstItem); 
       editMenu.add(previousItem); 
       editMenu.add(nextItem); 
       editMenu.add(lastItem); 
       menuBar.add(editMenu); 

       JMenu helpMenu = new JMenu("Help"); 
       JMenuItem documentationItem = new JMenuItem("Documentation"); 
       JMenuItem aboutItem = new JMenuItem("About"); 
       helpMenu.add(documentationItem); 
       helpMenu.add(aboutItem); 

       menuBar.add(helpMenu); 

       frame.setVisible(true); 

      } 
     }); 
    } 
} 

class AddressBookFrame extends JFrame 
{ 
    public AddressBookFrame() 
    { 
     setLayout(new BorderLayout()); 
     setTitle("Address Book"); 
     setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 
     AddressBookToolBar toolBar = new AddressBookToolBar(); 
     add(toolBar, BorderLayout.NORTH); 
     AddressBookStatusBar aStatusBar = new AddressBookStatusBar(); 
     add(aStatusBar, BorderLayout.SOUTH); 
     AddressBookForm form = new AddressBookForm(); 
     add(form, BorderLayout.CENTER); 
    } 
    public static final int DEFAULT_WIDTH = 500; 
    public static final int DEFAULT_HEIGHT = 500; 

} 

/* Create toolbar buttons and add buttons to toolbar */ 
class AddressBookToolBar extends JPanel 
{ 
    public AddressBookToolBar() 
    { 
     setLayout(new FlowLayout(FlowLayout.LEFT)); 
     JToolBar bar = new JToolBar(); 
     JButton newButton = new JButton("New"); 
     JButton editButton = new JButton("Edit"); 
     JButton deleteButton = new JButton("Delete"); 
     JButton findButton = new JButton("Find"); 
     JButton firstButton = new JButton("First"); 
     JButton previousButton = new JButton("Previous"); 
     JButton nextButton = new JButton("Next"); 
     JButton lastButton = new JButton("Last"); 
     bar.add(newButton); 
     bar.add(editButton); 
     bar.add(deleteButton); 
     bar.add(findButton); 
     bar.add(firstButton); 
     bar.add(previousButton); 
     bar.add(nextButton); 
     bar.add(lastButton); 
     add(bar); 
    } 
} 

/* Creates the status bar string */ 
class AddressBookStatusBar extends JPanel 
{ 
    public AddressBookStatusBar() 
    { 
     setLayout(new FlowLayout(FlowLayout.LEFT)); 
     this.statusBarString = new JLabel("Total: " + AddressBookForm.getTotalContacts()); 
     add(this.statusBarString); 
    } 

    public void updateLabel() 
    { 
     contactsLabel.setText(AddressBookForm.getTotalContacts().toString()); 
    } 

    private JLabel statusBarString; 
    private JLabel contactsLabel; 
} 

class AddressBookForm extends JPanel 
{ 
    public AddressBookForm() 
    { 
     // create form panel 
     this.setLayout(new GridLayout(2, 1)); 
     JPanel formPanel = new JPanel(); 
     formPanel.setLayout(new GridLayout(4, 2)); 
     firstName = new JTextField(20); 
     lastName = new JTextField(20); 
     telephone = new JTextField(20); 
     email = new JTextField(20); 
     JLabel firstNameLabel = new JLabel("First Name: ", JLabel.LEFT); 
     formPanel.add(firstNameLabel); 
     formPanel.add(firstName); 
     JLabel lastNameLabel = new JLabel("Last Name: ", JLabel.LEFT); 
     formPanel.add(lastNameLabel); 
     formPanel.add(lastName); 
     JLabel telephoneLabel = new JLabel("Telephone: ", JLabel.LEFT); 
     formPanel.add(telephoneLabel); 
     formPanel.add(telephone); 
     JLabel emailLabel = new JLabel("Email: ", JLabel.LEFT); 
     formPanel.add(emailLabel); 
     formPanel.add(email); 
     add(formPanel); 

     // create button panel 
     JPanel buttonPanel = new JPanel(); 
     JButton insertButton = new JButton("Insert"); 
     JButton displayButton = new JButton("Display"); 

     ActionListener insertAction = new AddressBookListener(); 
     ActionListener displayAction = new AddressBookListener(); 
     insertButton.addActionListener(insertAction); 
     displayButton.addActionListener(displayAction); 
     buttonPanel.add(insertButton); 
     buttonPanel.add(displayButton); 
     add(buttonPanel); 
    } 

    public static int getTotalContacts() 
    { 
     return addressList.size(); 
    } 

    //void addContact(Person contact); 

    private JTextField firstName; 
    private JTextField lastName; 
    private JTextField telephone; 
    private JTextField email; 
    private JLabel contacts; 

    private static List<Person> addressList = new ArrayList<Person>(); 

    private class AddressBookListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      String buttonPressed = e.getActionCommand(); 
      System.out.println(buttonPressed); 
      if (buttonPressed == "Insert") { 
       Person aPerson = new Person(firstName.getText(), lastName.getText(), telephone.getText(), email.getText()); 
       addressList.add(aPerson); 
      } 
      else { 
       for (Person p : addressList) { 
        System.out.println(p); 
       } 
      } 
     } 
    } 

} 

Mon autre question est de savoir pourquoi je reçois l'erreur, « int ne peut pas être déréférencé contactsLabel.setText (AddressbookForm.getTotalContacts() toString().)! Merci

Répondre

2

Gardez à l'esprit que par faisant addressList statique, il appartient à la classe AddressbookForm plutôt qu'à une instance de la classe. Cela signifie que tous AddressbookForm s partageront la même addressList. Je ne sais pas si c'est ce que vous voulez.

en ce qui concerne votre erreur, AddressbookForm.getTotalContacts() retourne un int. Puisque int est un type primitif en Java, il n'a pas de méthode toString(). Un entier peut être converti en un String comme:

int a = 5; 
String aString = a + ""; 
+1

Integer.valueOf (a) .toString() – Rhangaun

+4

'Integer.toString (a)' –

+0

Vous avez raison, je ne veux pas qu'il soit statique. Mais même encore, je ne sais pas comment accéder aux variables ... – Crystal

0

De mon point de vue, la bonne solution est d'utiliser l'emballage, entier, pour le type primitif int. Entier, comme toutes les classes de Java, étend Object et en conséquence a toString() pour le surcharger ou l'utiliser.

// http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html 
public static Integer getTotalContacts() 
{ 
    return new Integer(addressList.size()); 
} 
+0

on devrait faire Integer.valueOf (x) au lieu de new Entier (x) – unbeli

+0

@unbeli Comme la documentation dit Integer.valueOf (x) est recommandé si vous n'avez pas besoin d'une nouvelle instance. Par exemple: si vous voulez que le résultat de la méthode applique directement la méthode toString(). Mais si vous voulez qu'une nouvelle instance fonctionne avec, vous devez utiliser le constructeur. En utilisant valueOf (x), un cache est utilisé pour les valeurs fréquemment utilisées. De mon point de vue, si vous programmez sous le paradigme de la POO, vous devriez oublier tout type primitif, et c'est ce que je veux montrer dans l'exemple. – ocell

+0

pourquoi voudriez-vous une nouvelle instance d'Integer? – unbeli