Aplicar Singleton em JInternalFrame

Quero abrir apenas um JInternalFrame, pesquisei e achei o padrão Singleton, que cria apenas uma instância de uma classe, mas está dando erro, o seguinte erro:

Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException: illegal component position
at java.awt.Container.addImpl(Unknown Source)
at javax.swing.JLayeredPane.addImpl(Unknown Source)
at javax.swing.JDesktopPane.addImpl(Unknown Source)
at java.awt.Container.add(Unknown Source)
at View.TelaPrincipal$2$1.run(TelaPrincipal.java:154)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

só acontece esse erro se faço usando JInternalFrame.

alguém pode me ajudar??

desde já agradeço e no aguardo

Você pode colocar o código: TelaPrincipal.java: 154

Eu vejo que você usa uma classe interna.
Você pode colocar esse código?


RuGI

aqui dá erro na linha 155, pq tem uma comentada, se eu abro uma vez o JInternalFrame funciona normal, se eu fecho o mesmo e abro de novo também funcionada normal, agora se eu tento abrir o mesmo JInternalFrame com ele já aberto dá o erro a cima.

vlw pela ajuda

package View;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
//  
// Classe principal (Contem os menu's e chama o JInternalFrame de outra classe)  
//  
public class TelaPrincipal extends JFrame{  

  private static final long serialVersionUID = 1L;
  //Declaração das variáveis  
  public JFrame meuFrame;  
  private JDesktopPane meuDesktop;  
  private JMenuBar jmbBarraMenu; 
  private JMenu jmArquivo;
  private JMenuItem jmiArquivoLogoff;
  private JMenuItem jmiArquivoSair;
  private JMenu jmCliente;
  private JMenuItem jmiClienteCadastro;
  private JMenu jmEstoque;
  private JMenuItem jmiEstoqueCadastro;
  private JMenuItem jmiEstoqueCd;  
  private JMenuItem jmiEstoqueDvd;
  private JMenu jmFornecedor;
  private JMenuItem jmiFornecedorCadastro;
       
  //Variavel da tela de estados.  
  public TelaEstoqueCadastro telaEstoqueCadastro;
  public TelaClienteCadastro telaClienteCadastro;
  public TelaFornecedorCadastro telaFornecedorCadastro;
         
  /** 
  * Construtor da Classe 
  */  
  public TelaPrincipal(){  
	try{
      // Chama o metodo responsavel por criar a janela  
      WindowGUI();
      // Modifica o valor YES/NO da JOptionPane para SIM/NAO.  
      UIManager.put("OptionPane.yesButtonText","Sim");  
      UIManager.put("OptionPane.noButtonText","Não");
	}catch(Exception e){
	  e.printStackTrace();
	}
  }  
   
  /** 
  * Metodo responsavel por criar a janela 
  */  
  private void WindowGUI() throws Exception
  {  
    // Cria o Desktop Pane  
    meuDesktop = new JDesktopPane();  
    meuDesktop.setLayout(null);  
    meuDesktop.setBackground(Color.GRAY);
    meuDesktop.setBounds(0,0,1019,723);  
           
    // Cria Barra de Menu  
    jmbBarraMenu = new JMenuBar();
    
    jmArquivo = new JMenu("Arquivo");
    jmiArquivoLogoff = new JMenuItem("Logoff");
    jmArquivo.add(jmiArquivoLogoff);
    jmiArquivoSair = new JMenuItem("Sair");
    jmArquivo.add(jmiArquivoSair);
    jmbBarraMenu.add(jmArquivo);
    
    jmCliente = new JMenu("Cliente");
    jmiClienteCadastro = new JMenuItem("Cadastro");
    jmCliente.add(jmiClienteCadastro);
    jmbBarraMenu.add(jmCliente);
           
    jmEstoque = new JMenu("Estoque");  
    jmiEstoqueCadastro = new JMenuItem("Cadastro");
    jmEstoque.add(jmiEstoqueCadastro);
    jmiEstoqueCd = new JMenuItem("CD");   
    jmEstoque.add(jmiEstoqueCd);  
    jmiEstoqueDvd = new JMenuItem("DVD");
    jmEstoque.add(jmiEstoqueDvd);
    jmbBarraMenu.add(jmEstoque);
    
    jmFornecedor = new JMenu("Fornecedor");
    jmiFornecedorCadastro = new JMenuItem("Cadastro");
    jmFornecedor.add(jmiFornecedorCadastro);
    jmbBarraMenu.add(jmFornecedor);
           
    // Cria a janela.         
    meuFrame = new JFrame("Loja de Artigos");   
           
    // Seta a barra e o content pane anexando ao JFrame.  
    meuFrame.setJMenuBar(jmbBarraMenu);  
           
    // Cria o tamanho da tela.  
    meuFrame.setSize(1024,768);  
    meuFrame.setLayout(null);  
    meuFrame.setResizable(false);  
           
    // Centraliza a tela.  
    meuFrame.setLocationRelativeTo(null);  
    meuFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    meuFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    meuFrame.add(meuDesktop); // Adicionando o desktop no frame principal.  
           
    // Mostra a janela.  
    meuFrame.setVisible(true);    
    
    //Declaração dos Action Listener
    jmiClienteCadastro.addActionListener(new ActionListener(){
	  public void actionPerformed(ActionEvent e){
		SwingUtilities.invokeLater(new Runnable(){
		  public void run(){
			//Define o look-and-feel
			try{
			  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			}catch(Exception ex){
			  ex.printStackTrace();
			}
			try{
			  telaClienteCadastro = new TelaClienteCadastro();
			}catch (ParseException e) {
				e.printStackTrace();
			}
			meuDesktop.add(telaClienteCadastro);
			telaClienteCadastro.setVisible(true);
		  }
		});			
	  }
	});
           
    jmiEstoqueCadastro.addActionListener(new ActionListener(){
	  public void actionPerformed(ActionEvent event){
		SwingUtilities.invokeLater(new Runnable(){
		  public void run(){
			//Define o look-and-feel
			try{
			  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			}catch (Exception ex){
			   ex.printStackTrace();
		    }
			telaEstoqueCadastro = TelaEstoqueCadastro.getInstance();
			//telaEstoqueCadastro = new TelaEstoqueCadastro();
		    meuDesktop.add(telaEstoqueCadastro);
		    telaEstoqueCadastro.setVisible(true);
		  }
	    });
	  }
    });
    
    jmiFornecedorCadastro.addActionListener(new ActionListener(){
  	  public void actionPerformed(ActionEvent arg0){
  		SwingUtilities.invokeLater(new Runnable(){
  		  public void run(){
  			//Define o look-and-feel
  			try{
  			  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  			}catch(Exception ex){
  			  ex.printStackTrace();
  			}
  			telaFornecedorCadastro = new TelaFornecedorCadastro();
  			meuDesktop.add(telaFornecedorCadastro);
  			telaFornecedorCadastro.setVisible(true);
  		  }
  		});			
  	  }
  	});
  }
}  

Uma pergunta: o que é telaEstoqueCadastro? "JPanel? "JForm? outro JDesktopPane

A exceção:

java.lang.IllegalArgumentException: posição componente ilegal

Ocorre quando você tenta adicionar um componente a um contêiner sobre o mesmo nível ou superior.

Exemplo:

New JPanel (), add (new JFrame) jogou o mesmo erro.

Verifique se você tentar composição é válido.


RuGI

telaEstoqueCadastro é um JInternalFrame.

telaFornecedorCadastro também?

sim, ela também é.

só que apenas a telaEstoqueCadastro está com o padrão singleton, pois estou tentando fazer nela e deu esse erro. No caso eu tenho essa telaPrincipal e a partir dos menus so chamo JInternalFrame.

Cara,

VOCÊ NÃO PRECISA DE UM SINGLETON.

Tira fora esse singleton que não tem nada a ver com o que vc quer, o ideal é criar o JInternalFrame cada vez e ponto final.

Para saber se o JInternalFrame esta aberto vc pode percorrer os frames dentro do JDesktopFrame e verficar se a classe é a mesma do que você está tentando abrir, se for, vc simplesmente pode pegar o frame encontrato e dar um moveToFront.

Eu já tentei fazer sem o singleton mas também não deu certo, consegui manter apenas um JinternalFrame do mesmo tipo aberto, mas quando fechava esse JInternalFrame o mesmo não abria direito, fiz da seguinte forma:

itemMenuEstoqueCadastro.addActionListener(new ActionListener(){
	  public void actionPerformed(ActionEvent event){
		SwingUtilities.invokeLater(new Runnable(){
		  public void run(){
			//Define o look-and-feel
			try{
			  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			}catch (Exception ex){
			   ex.printStackTrace();
		    }
		    //Inicia o frame principal
			if(telaEstoqueCadastro == null){
			  telaEstoqueCadastro = new TelaEstoqueCadastro();
		      meuDesktop.add(telaEstoqueCadastro);
		      telaEstoqueCadastro.setVisible(true);
			}else
			  telaEstoqueCadastro.moveToFront();
		  }
	    });
	  }
    });