Re:JInternalFrame Singleton - IllegalArgumentException

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;



public class JanelaIn extends JFrame {
	JDesktopPane desk;
	JButton botao;



	public JanelaIn() {
		super();
		desk = new JDesktopPane();
		botao = new JButton("Adicionar");
		
		getContentPane().add(botao,BorderLayout.NORTH);
		getContentPane().add(desk,BorderLayout.CENTER);

		botao.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				JInternalFrame f = SingletonInternalFrame.getInstance();
				desk.add(f);

			}


		});

		setSize(500,500);
		setVisible(true);

	}

	public static void main(String[] args) {
		new JanelaIn();

	}

}




class SingletonInternalFrame extends JInternalFrame {  



	private SingletonInternalFrame() {  
		super();  
		init();  
	}  

	protected void init() {  
		setMaximizable(true);  
		setIconifiable(true);  
		setClosable(true);  
		setVisible(true);  

		setSize(new Dimension(300, 300));  
	}  

	public static synchronized JInternalFrame getInstance() {  

		return new SingletonInternalFrame();  

	}  

       
       
 }  

De uma olhada em:
http://www.patternizando.com.br/?p=51

Você só deve dar add no painel uma única vez. O resto é só brincar com o setVisible(true) e setVisible(false).

Outra coisa. Você combinou duas más práticas num só aplicativo. A primeira é usar Singleton, que tem vários problemas em java. Você não só o utilizou, como também o fez de uma forma menos recomendada. Se você usa Java 5 ou superior, o ideal seria fazer através de um enum. Como nesse caso existe herança, o ideal seria inicializar diretamente o campo estático, e tirar aquele lazy-initialization dali.

[code]public class SingletonInternalFrame extends JInternalFrame {
private static final SingletonInternalFrame frame = new SingletonInternalFrame();

public static JInternalFrame getInstance() {  
     return frame;  
}  
...

[/code]

A segunda é usar o JInternalFrame. É um dos componentes mais bugados do Swing. Ele tem diversos problemas: Sua barra de títulos não some com a janela maximizada, não existe rolagem no desktop pane quando o internal frame sai da janela, não existem internal frames modais, entre outras coisas.

Boa tarde prezados.
Sei que existem muitos tópicos a respeito, porém mesmo utilizando todos eles fiquei travado aqui:

*Essa é minha classe Singleton de JInternalFrame

public class SingletonInternalFrame extends JInternalFrame {
    
    private static JInternalFrame frame;
    
    private SingletonInternalFrame() {
        super();
        init();
    }
    
    protected void init() {
        setMaximizable(true);
        setIconifiable(true);
        setClosable(true);
        setVisible(true);
        
        setSize(new Dimension(300, 300));
                
    }
    
    public static synchronized JInternalFrame getInstance() {
        if (frame == null) 
            frame = new SingletonInternalFrame();
        return frame;
    }
    
    
    
}

Faço a chamada à classe aqui:

JInternalFrame f = SingletonInternalFrame.getInstance();
indexPanel.add(f);

Quando o botão é acionado a primeira vez o frame aparece que eh uma beleza, mas no segundo clique o erro a seguir aparece:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: illegal component position
        at java.awt.Container.addImpl(Container.java:1034)
        at javax.swing.JLayeredPane.addImpl(JLayeredPane.java:209)
        at javax.swing.JDesktopPane.addImpl(JDesktopPane.java:470)
        at java.awt.Container.add(Container.java:352)
        at fulcontrol.ui.IndexUI.jLabel9MouseClicked(IndexUI.java:554)
        at fulcontrol.ui.IndexUI.access$100(IndexUI.java:26)
        at fulcontrol.ui.IndexUI$2.mouseClicked(IndexUI.java:203)
        at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253)
        at java.awt.Component.processMouseEvent(Component.java:6041)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5803)
        at java.awt.Container.processEvent(Container.java:2058)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Container.dispatchEventImpl(Container.java:2116)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3995)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
        at java.awt.Container.dispatchEventImpl(Container.java:2102)
        at java.awt.Window.dispatchEventImpl(Window.java:2429)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Alguem pode me ajudar???
Até!