2010-06-10 3 views
5

У меня возникли проблемы с идеей доступа к переменным из других классов. У меня был пост: , где я получил полезную информацию, и подумал, что пример будет лучше показать его и задать отдельный вопрос. У меня есть форма, в которую я могу вводить данные, и имеет переменную List. Сначала я не стал статичным, но я подумал, что если мне нужно получить общий размер из другого класса, то я бы не создал экземпляр этого класса, чтобы использовать эту функцию для getTotalContacts. Я в основном хочу обновить свою строку состояния с общим количеством контактов, которые находятся в моем списке. Один из участников сказал в вышеупомянутом сообщении, чтобы использовать оригинальный член Foo для получения контактов, но я не уверен, как это работает в этом случае. Любые мысли были бы оценены. Благодарю.Использование геттеров/сеттеров в 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); 
       } 
      } 
     } 
    } 

} 

Мой другой вопрос, почему я получаю сообщение об ошибке, «INT не может быть разыменовываются contactsLabel.setText (AddressbookForm.getTotalContacts() ToString().)! Благодаря

ответ

2

Имейте в виду, что что делает addressList статична, она принадлежит к AddressbookForm классу, а не к экземпляру класса. Это означает, что все AddressbookForm s будут делить один и тот же addressList. Я не уверен, если это то, что вы хотите.

что касается вашего ошибка, AddressbookForm.getTotalContacts() возвращает int. Поскольку int является примитивным типом в Java, он не имеет метода toString(). INT может быть преобразован в String как:

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

Integer.valueOf (а) .ToString() – Rhangaun

+4

'Integer.toString (а)' –

+0

Вы правы, я не хочу быть статичным. Но даже не знаю, как получить доступ к переменным ... – Crystal

0

С моей точки зрения, правильное решение использовать обертку, Integer, для примитивного типа междунар. Целое число, как и все классы в Java, расширяет Object и, следовательно, имеет доступ к toString(), чтобы переопределить его или использовать.

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

следует делать Integer.valueOf (x) вместо нового Integer (x) – unbeli

+0

@unbeli Как говорится в документации, Integer.valueOf (x) рекомендуется, если вам не нужен новый экземпляр. Например: если вы хотите, чтобы результат метода напрямую применил метод toString(). Но если вы хотите, чтобы новый экземпляр работал с ним, вы должны использовать конструктор. Используя valueOf (x), кеш используется для часто используемых значений. С моей точки зрения, если вы программируете в рамках парадигмы ООП, вы должны забыть любой примитивный тип, и именно это я хочу показать в этом примере. – ocell

+0

Зачем вам нужен новый экземпляр Integer? – unbeli

Смежные вопросы