2010-06-10 13 views
5

Tengo problemas con la idea de acceder a variables de otras clases. Tuve una publicación aquí: Having access to a private variable from other classes in Java donde obtuve información útil, y pensé que un ejemplo sería mejor mostrarlo, y hacer una pregunta por separado también. Tengo un formulario al que puedo ingresar datos, y tiene una variable de lista. No lo hice estático al principio, pero pensé que si necesitaba obtener el tamaño total de otra clase, no crearía una instancia de esa clase para usar la función para obtenerTotalContacts. Básicamente quiero actualizar mi barra de estado con la cantidad total de contactos que están en mi lista. Uno de los miembros dijo en el post anterior que usara el miembro original de Foo para obtener los contactos, pero no estoy seguro de cómo funciona en este caso. Cualquier pensamiento sería apreciado. Gracias.Usando 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); 
       } 
      } 
     } 
    } 

} 

Mi otra pregunta es ¿por qué recibo el error "int no se puede dereferenced contactsLabel.setText (AddressbookForm.getTotalContacts toString()().);! Gracias

Respuesta

2

Tenga en cuenta que por haciendo addressList estática, pertenece a la clase AddressbookForm en lugar de a una instancia de la clase. Esto significa que todos los AddressbookForm s estarán compartiendo el mismo addressList. no estoy seguro de si eso es lo que desea.

en cuanto a su error, AddressbookForm.getTotalContacts() devuelve un int. Como int es un tipo primitivo en Java, no tiene el método toString(). Un int se puede convertir en una como String:

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

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

+4

Integer.toString (a)' –

+0

Tienes razón, no quiero que sea estática. Pero aún así, no estoy seguro de cómo acceder a las variables ... – Crystal

0

Desde mi punto de vista la solución correcta es utilizar la envoltura, Integer, para la int tipo primitivo. Entero, como todas las clases en Java, extiende Object y, en consecuencia, tiene disponible toString() para anularlo o usarlo.

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

uno debe hacer Integer.valueOf (x) en lugar del nuevo Integer (x) – unbeli

+0

@unbeli Como la documentación dice Integer.valueOf (x) se recomienda si no necesita una nueva instancia. Por ejemplo, si desea que el resultado del método aplique directamente el método toString(). Pero si quiere que una nueva instancia trabaje con ella, debe usar el constructor. Usando valueOf (x) se usa una memoria caché para los valores utilizados frecuentemente. Desde mi punto de vista, si estás programando bajo el paradigma de OOP, debes olvidar cualquier tipo de primitivo, y eso es lo que quiero mostrar en el ejemplo. – ocell

+0

¿por qué quieres una nueva instancia de Integer? – unbeli