Implementação de Singleton

7 respostas
cle.darsie

Olá amigos do GUJ,
Eu novamente tirando dúvidas...

Agora é o seguinte:
Tenho duas classes, um tratador de eventos e uma de controle.

Na classe tratadora de eventos, tenho os botões, que quando eu clico, deveria executar a ação da classe controle.
Porém está acontecendo um erro: "[color=red]Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException[/color]" .

Conversei com um professor, e ele pediu pra pesquisar sobre Singleton, que poderia me ajudar nisso. Para criar uma instância da classe que eu quero.
Eu dei uma estudada, já sei pra que serve e tudo mais, só que não consigo implementar pra parar com o problema.

Segue minhas classes que quero instanciar uma em outra:

Class TratadorAgenda
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

import br.com.agenda.principal.Control;

public class TratadorAgenda implements ActionListener {
	private JButton add, search, list, remove, exit, qtd;
	private Control ctrl;

	public TratadorAgenda(JButton add, JButton search, JButton list,
			JButton remove, JButton qtd) {
		this.add = add;
		this.search = search;
		this.list = list;
		this.remove = remove;
		this.qtd = qtd;
	}

	public TratadorAgenda(Control ctrl){
		this.ctrl = ctrl;
	}
	
	public TratadorAgenda(JButton exit) {
		this.exit = exit;
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == add) {
			ctrl.addContact();
		}
		if (e.getSource() == search) {
			ctrl.searchContact();
		}
		if (e.getSource() == list) {
			ctrl.listContact();
		}
		if (e.getSource() == remove) {
			ctrl.removeContact();
		}
		if (e.getSource() == qtd) {
			ctrl.quantity();
		}
		if (e.getSource() == exit) {
			System.exit(0);
		}
	}
}
Class Control
import java.io.IOException;
import java.util.List;
import javax.swing.JOptionPane;

import br.com.agenda.telas.PanelCad;
import br.com.agenda.tratador.TratadorAgenda;

public class Control {
	private Agenda agenda = new Agenda();
	private Contact contact;
	private PanelCad set;

	public Control(){
		new TratadorAgenda(this);
	}

	public void addContact() {
		contact = new Contact();

		contact.setName(set.getNome());
		contact.setAge(set.getAge());
		contact.setPhone(set.getPhone());

		try {
			agenda.addContact(contact);
		} catch (IOException e) {
			e.printStackTrace();
		}
		set.setStatus("Contact successfully added!");
	}

	public void searchContact() {
		String nome = set.getNome();
		Contact c = agenda.searchContact(nome);

		if (c != null) {
			System.out.println("Name: " + c.getName());
			System.out.println("Age: " + c.getAge());          //Isso quero gravar em Table logo mais.
			System.out.println("Phone:: " + c.getPhone());
		} else {
			set.setStatus("Contact not found!");
		}
	}

	public void listContact() {
		List<Contact> contact = agenda.getContacts();

		if (agenda.quantity() == 0) {
			set.setStatus("Your agenda is empty! Add contacts!");
		}
		for (Contact a : contact) {
			System.out.println("Name: " + a.getName());
			System.out.println("Age: " + a.getAge());          //Isso quero gravar em Table logo mais.
			System.out.println("Phone:: " + a.getPhone());
		}
	}

	public void removeContact() {
		String name = set.getNome();
		if (agenda.exists(name) == true) {
			Contact c = agenda.searchContact(name);

			int choice = JOptionPane.showConfirmDialog(null,
					"Remove contact from agenda?", "Removing",
					JOptionPane.YES_NO_OPTION);

			if (choice == JOptionPane.YES_OPTION) {
				agenda.removeContact(name);
				set.setStatus("Contact successfully removed!");

				if (c != null) {
					System.out.println("Name: " + c.getName());
					System.out.println("Age: " + c.getAge());          //Isso quero gravar em Table logo mais.
					System.out.println("Phone:: " + c.getPhone());
				}
				if (choice == JOptionPane.NO_OPTION) {
					set.setStatus("Action Cancelled!");
				} else {
				}
			} else {
				set.setStatus("Contact not found!");
			}
		}
	}

	public void quantity() {
		int quant = 0;
		quant = agenda.quantity();
		if (quant == 0) {
			set.setStatus("The agenda is empty! Add contacts!");
		}
		if (quant == 1) {
			set.setStatus("There is " + quant + " contact added!");
		}
		if (quant > 1) {
			set.setStatus("There are " + quant + " contacts added!");
		}
	}
}

Alguém consegue me ajudar a implementar um Singleton aí pra eu não ter mais aquele problema?

Obrigado.

7 Respostas

O_Monge

Não estou vendo onde teu código tem um Singleton…

http://www.guj.com.br/articles/137
http://pt.wikipedia.org/wiki/Singleton#Em_Java

Cole o erro completo…

cle.darsie

Então, ai que está o problema! Meu código não tem nenhum singleton, eu queria saber como é que eu faço pra implementar um nesse código.

Se eu crio uma classe a parte, ou se eu crio um método dentro da classe controle. Todos os artigos que eu li até hoje só mostram o método singleton, mas não mostram ele em funcionamento.

O meu erro completo é o seguinte:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at br.com.agenda.tratador.TratadorAgenda.actionPerformed(TratadorAgenda.java:30) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6289) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6054) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4652) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) at java.awt.EventQueue.access$000(EventQueue.java:85) at java.awt.EventQueue$1.run(EventQueue.java:603) at java.awt.EventQueue$1.run(EventQueue.java:601) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) at java.awt.EventQueue$2.run(EventQueue.java:617) at java.awt.EventQueue$2.run(EventQueue.java:615) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Obrigado…

ViniGodoy

Cuidado. Muitos dos seus construtores do TratadorAgenda não inicializam a variável ctrl. Não supreendentemente, quando você vai usa-la, seu conteúdo estará nulo, disparando a exceção que você está vendo.

Singleton dificilmente é solução para qualquer tipo de problema.

O_Monge
ViniGodoy:
Cuidado. Muitos dos seus construtores do TratadorAgenda não inicializam a variável ctrl. Não supreendentemente, quando você vai usa-la, seu conteúdo estará nulo, disparando a exceção que você está vendo.

Singleton dificilmente é solução para qualquer tipo de problema.

Teu problema, como ele disse, é o Control... Tu não inicializa ele..

O que o teu professor quis dizer, provavelmente, é que o Control deveria ser singleton. Para saber como fazer isso, consulta os links que passei antes..

Mas teria o problema que a Agenda também deverá ser singleton neste caso..

Só explicando sem detalhes técnicos, o singleton é tu tirar a possibilidade do usuário(desenvolvedor) instanciar um novo objeto..

Ou seja, ao invés de poderes fazer new Control() em qualquer parte do teu sistema, e ter variáveis igual a tua (private Control ctrl) terias:

public class Control {
   private static Control instance;

   private Control() {}
   public static Control getInstance() {
      if ( instance == null ) {
          instance = new Control();
      }
      return control;
   }
}

E, em todos os pontos onde queres se referencia a um Control: Control.getInstance();

Assim, nunca o Control será nulo..

Mas tenta primeiro inicializar a variável ctrl do teu TratadorAgenda, é a mais viável eu acho

cle.darsie

Obrigado pelas explicações...

Não consigo inicializar as variáveis de outra forma, ou melhor, eu não sei fazer isso.

Então, em relação ao singleton, vamos ver se eu compreendi bem.
Fiz o que você falou O_Monge, de criar a classe como um Singleton, na verdade fiz em todas as classes que eram iniciadas em outras, como você tinha visto no caso da class Agenda.

Porém continua com o mesmo erro agora.
Por favor, veja se está certo o que eu fiz:

[color=red]Class Control[/color]
import java.io.IOException;
import java.util.List;
import javax.swing.JOptionPane;

import br.com.agenda.telas.PanelCad;

public class Control {  
	private static Control instance;  
  
	private Control() {}  
	public static Control getInstance() {  
		if ( instance == null ) {  
			instance = new Control();  
		}  
		return instance;  
	} 
	
	private PanelCad set;

	public void addContact() {
		Contact.getInstance().setName(set.getNome());
		Contact.getInstance().setAge(set.getAge());
		Contact.getInstance().setPhone(set.getPhone());

		try {
			Agenda.getInstance().addContact(Contact.getInstance());
		} catch (IOException e) {
			e.printStackTrace();
		}
		set.setStatus("Contact successfully added!");
	}

	public void searchContact() {
		String nome = set.getNome();
		Contact c = Agenda.getInstance().searchContact(nome);

		if (c != null) {
			System.out.println("Name: " + c.getName());
			System.out.println("Age: " + c.getAge());
			System.out.println("Phone:: " + c.getPhone());
		} else {
			set.setStatus("Contact not found!");
		}
	}

	public void listContact() {
		List<Contact> contact = Agenda.getInstance().getContacts();

		if (Agenda.getInstance().quantity() == 0) {
			set.setStatus("Your agenda is empty! Add contacts!");
		}
		for (Contact a : contact) {
			System.out.println("Name: " + a.getName());
			System.out.println("Age: " + a.getAge());
			System.out.println("Phone:: " + a.getPhone());
		}
	}

	public void removeContact() {
		String name = set.getNome();
		if (Agenda.getInstance().exists(name) == true) {
			Contact c = Agenda.getInstance().searchContact(name);

			int choice = JOptionPane.showConfirmDialog(null,
					"Remove contact from agenda?", "Removing",
					JOptionPane.YES_NO_OPTION);

			if (choice == JOptionPane.YES_OPTION) {
				Agenda.getInstance().removeContact(name);
				set.setStatus("Contact successfully removed!");

				if (c != null) {
					System.out.println("Name: " + c.getName());
					System.out.println("Age: " + c.getAge());
					System.out.println("Phone:: " + c.getPhone());
				}
				if (choice == JOptionPane.NO_OPTION) {
					set.setStatus("Action Cancelled!");
				} else {
				}
			} else {
				set.setStatus("Contact not found!");
			}
		}
	}

	public void quantity() {
		int quant = 0;
		quant = Agenda.getInstance().quantity();
		if (quant == 0) {
			set.setStatus("The agenda is empty! Add contacts!");
		}
		if (quant == 1) {
			set.setStatus("There is " + quant + " contact added!");
		}
		if (quant > 1) {
			set.setStatus("There are " + quant + " contacts added!");
		}
	}
}
[color=red]Class Agenda[/color]
import java.io.IOException;
import java.util.ArrayList;

public class Agenda {
	private static Agenda instance;  
	  
	private Agenda() {}  
	public static Agenda getInstance() {  
		if ( instance == null ) {  
			instance = new Agenda();  
		}  
		return instance;  
	}
	
	ArrayList<Contact> contacts = new ArrayList<Contact>();

	public boolean addContact(Contact c) throws IOException {
		return contacts.add(c);
	}

	public boolean removeContact(String nome) {
		Contact contactRemove = Contact.getInstance();
		contactRemove.setName(nome);
		return contacts.remove(contactRemove);
	}

	public Contact searchContact(String nome) {
		for (Contact c : contacts) {
			if (c.getName().equalsIgnoreCase(nome))
			{
				return c;
			}
		}
		return null;
	}

	public int quantity() {
		return this.contacts.size();
	}

	public boolean exists(String nome) {
		Contact verify = Contact.getInstance();
		verify.setName(nome);
		return contacts.contains(verify);
	}

	public ArrayList<Contact> getContacts() {
		return this.contacts;
	}
}
[color=red]Class Contact[/color]
public class Contact {
	private static Contact instance;  
	  
	private Contact() {}  
	public static Contact getInstance() {  
		if ( instance == null ) {  
			instance = new Contact();  
		}  
		return instance;  
	} 
	
	private String name;
	private String age;
	private String phone;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}

	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	
	public boolean equals(Object obj) {
		if (((Contact) obj).getName().equalsIgnoreCase(this.name))
			return true;
		return super.equals(obj);
	}
}
[color=red]Class TratadorAgenda[/color]
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;

import br.com.agenda.principal.Control;

public class TratadorAgenda implements ActionListener {
	private JButton add, search, list, remove, exit, qtd;

	public TratadorAgenda(JButton add, JButton search, JButton list,
			JButton remove, JButton qtd) {
		this.add = add;
		this.search = search;
		this.list = list;
		this.remove = remove;
		this.qtd = qtd;
	}
	
	public TratadorAgenda(JButton exit) {
		this.exit = exit;
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == add) {
			Control.getInstance().addContact();
		}
		if (e.getSource() == search) {
			Control.getInstance().searchContact();
		}
		if (e.getSource() == list) {
			Control.getInstance().listContact();
		}
		if (e.getSource() == remove) {
			Control.getInstance().removeContact();
		}
		if (e.getSource() == qtd) {
			Control.getInstance().quantity();
		}
		if (e.getSource() == exit) {
			System.exit(0);
		}
	}
}

E o erro que persiste:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at br.com.agenda.principal.Control.addContact(Control.java:21)
	at br.com.agenda.tratador.TratadorAgenda.actionPerformed(TratadorAgenda.java:25)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6289)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6054)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4652)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4482)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4482)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644)
	at java.awt.EventQueue.access$000(EventQueue.java:85)
	at java.awt.EventQueue$1.run(EventQueue.java:603)
	at java.awt.EventQueue$1.run(EventQueue.java:601)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:617)
	at java.awt.EventQueue$2.run(EventQueue.java:615)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:614)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Bom, obrigado denovo..

O_Monge

cle.darsie:
Obrigado pelas explicações…

Não consigo inicializar as variáveis de outra forma, ou melhor, eu não sei fazer isso.

Então, em relação ao singleton, vamos ver se eu compreendi bem.
Fiz o que você falou O_Monge, de criar a classe como um Singleton, na verdade fiz em todas as classes que eram iniciadas em outras, como você tinha visto no caso da class Agenda.

Porém continua com o mesmo erro agora.
(…)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at br.com.agenda.principal.Control.addContact(Control.java:21) at br.com.agenda.tratador.TratadorAgenda.actionPerformed(TratadorAgenda.java:25) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6289) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6054) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4652) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4482) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:644) at java.awt.EventQueue.access$000(EventQueue.java:85) at java.awt.EventQueue$1.run(EventQueue.java:603) at java.awt.EventQueue$1.run(EventQueue.java:601) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) at java.awt.EventQueue$2.run(EventQueue.java:617) at java.awt.EventQueue$2.run(EventQueue.java:615) at java.security.AccessController.doPrivileged(Native Method) at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) at java.awt.EventQueue.dispatchEvent(EventQueue.java:614) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Bom, obrigado denovo…

Bom… eu sei que tás no começo então vamos por partes

1o. Sobre o erro
Primeiro, não é o mesmo erro… É o mesmo tipo de erro.
Note o que stacktrace está indicando…

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at br.com.agenda.principal.Control.addContact(Control.java:21) at br.com.agenda.tratador.TratadorAgenda.actionPerformed(TratadorAgenda.java:25) ...

Diz que ocorreu NullPointerException na linha 21, da classe br.com.agenda.principal.Control.java, no método addContact. Este método, por sua vez, foi chamado pela classe br.com.agenda.tratador.TratadorAgenda, no método actionPerformed exatamente na linha 25.

Estou explicando isso porque no futuro, em qualquer erro, é esse o caminho que deves observar para entender, corrigir e prevenir o erro.

Na linha 21, do Control:Contact.getInstance().setName(set.getNome());

Como o Control.getInstance() não é nulo (observe o código do getInstance e verás que não tem como), o erro está, logicamente, no set.

Em nenhum momento, tu atribui um valor a ele…

2o. Sobre o uso do singleton
Eu observei que tás bem confuso sobre como fazer isso, e percebi que não fui claro no meu conselho final na outra mensagem…

Esquece o singleton… Precisas aprender outros conceitos antes…

3o. Inicialização do objeto

Pra ti usar um Object, uma variável, tu primeiro precisa inicializar ela, ou seja, setar um valor a ela.

Agenda a = new Agenda();

Control c = new Control();

Não podes ter um atributo “Agenda a” e querer usar alguma função da Agenda a partir desse “a”. Como fizesse:

private PanelCad set;  
public void addContact() {  
        Contact.getInstance().setName(set.getNome());  
}

No teu Agenda, não possui nenhum setter para o set… Então, nunca vai ser inicializado ele…

Concluíndo…

1: Esquece o Singleton…

2: NullPointerException: Algum objeto que estás acessando está nulo. Ou seja, algum objeto da linha que ocorreu o erro não foi inicializado. Solução: Inicialize o objeto

cle.darsie

Pois então O_Monge,

Agora eu até entendi como funciona o singleton, no caso, eu até utilizei ele errado ali, mas já fiz uma melhoria.
O problema agora é a variável [color=blue]set[/color].

Se eu não inicializo ele, como eu estava fazendo, ocorre aquele erro de NullPointerException, mas só quando eu tento incluir um valor na agenda.
Porém, se eu inicializo ele desse jeito: PanelCad set = new PanelCad(); o programa nem abre, demora um tempo, e aparece o seguinte erro, mais cabuloso ainda! haha…

Exception in thread "main" java.lang.StackOverflowError at javax.swing.text.StyleContext$SmallAttributeSet.containsAttributes(StyleContext.java:959) at javax.swing.text.StyleContext$SmallAttributeSet.equals(StyleContext.java:838) at java.util.WeakHashMap.eq(WeakHashMap.java:259) at java.util.WeakHashMap.get(WeakHashMap.java:353) at java.util.Collections$SynchronizedMap.get(Collections.java:1975) at javax.swing.text.StyleContext.getImmutableUniqueSet(StyleContext.java:503) at javax.swing.text.StyleContext.addAttributes(StyleContext.java:323) at javax.swing.text.AbstractDocument$AbstractElement.addAttributes(AbstractDocument.java:1971) at javax.swing.text.AbstractDocument$AbstractElement.<init>(AbstractDocument.java:1762) at javax.swing.text.AbstractDocument$LeafElement.<init>(AbstractDocument.java:2488) at javax.swing.text.AbstractDocument$BidiElement.<init>(AbstractDocument.java:2660) at javax.swing.text.AbstractDocument.<init>(AbstractDocument.java:132) at javax.swing.text.AbstractDocument.<init>(AbstractDocument.java:92) at javax.swing.text.PlainDocument.<init>(PlainDocument.java:74) at javax.swing.text.PlainDocument.<init>(PlainDocument.java:64) at javax.swing.text.DefaultEditorKit.createDefaultDocument(DefaultEditorKit.java:113) at javax.swing.plaf.basic.BasicTextUI.installUI(BasicTextUI.java:785) at javax.swing.JComponent.setUI(JComponent.java:662) at javax.swing.text.JTextComponent.setUI(JTextComponent.java:322) at javax.swing.text.JTextComponent.updateUI(JTextComponent.java:332) at javax.swing.text.JTextComponent.<init>(JTextComponent.java:306) at javax.swing.JTextField.<init>(JTextField.java:212) at javax.swing.JTextField.<init>(JTextField.java:153) at br.com.agenda.telas.PanelCad.<init>(PanelCad.java:21) at br.com.agenda.principal.Control.<init>(Control.java:13) at br.com.agenda.principal.Control.getInstance(Control.java:18) at br.com.agenda.tratador.TratadorAgenda.<init>(TratadorAgenda.java:20) at br.com.agenda.telas.PanelCad.<init>(PanelCad.java:43) at br.com.agenda.principal.Control.<init>(Control.java:13) at br.com.agenda.principal.Control.getInstance(Control.java:18) at br.com.agenda.tratador.TratadorAgenda.<init>(TratadorAgenda.java:20) (...)
E tem muito mais ainda, esse erro que postei, não está nem na metade!

Existe alguma coisa forma de inicializar o aquele set?

Eu tinha feito esse código todo em uma classe só, que estava funcionando, mas o professor pediu para separar as classes de eventos e de controle.
E agora eu estou nessa!

Criado 12 de abril de 2011
Ultima resposta 12 de abr. de 2011
Respostas 7
Participantes 3