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.
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);
}
});
}
});
}
}
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.
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();
}
});
}
});