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.
Você pode colocar o código: TelaPrincipal.java: 154
Eu vejo que você usa uma classe interna.
Você pode colocar esse código?
RuGI
E
Eduardo_Henrique
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
packageView;importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.text.ParseException;importjavax.swing.JDesktopPane;importjavax.swing.JFrame;importjavax.swing.JMenu;importjavax.swing.JMenuBar;importjavax.swing.JMenuItem;importjavax.swing.SwingUtilities;importjavax.swing.UIManager;importjavax.swing.WindowConstants;// // Classe principal (Contem os menu's e chama o JInternalFrame de outra classe) // publicclassTelaPrincipalextendsJFrame{privatestaticfinallongserialVersionUID=1L;//Declaração das variáveis publicJFramemeuFrame;privateJDesktopPanemeuDesktop;privateJMenuBarjmbBarraMenu;privateJMenujmArquivo;privateJMenuItemjmiArquivoLogoff;privateJMenuItemjmiArquivoSair;privateJMenujmCliente;privateJMenuItemjmiClienteCadastro;privateJMenujmEstoque;privateJMenuItemjmiEstoqueCadastro;privateJMenuItemjmiEstoqueCd;privateJMenuItemjmiEstoqueDvd;privateJMenujmFornecedor;privateJMenuItemjmiFornecedorCadastro;//Variavel da tela de estados. publicTelaEstoqueCadastrotelaEstoqueCadastro;publicTelaClienteCadastrotelaClienteCadastro;publicTelaFornecedorCadastrotelaFornecedorCadastro;/** * Construtor da Classe */publicTelaPrincipal(){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(Exceptione){e.printStackTrace();}}/** * Metodo responsavel por criar a janela */privatevoidWindowGUI()throwsException{// Cria o Desktop Pane meuDesktop=newJDesktopPane();meuDesktop.setLayout(null);meuDesktop.setBackground(Color.GRAY);meuDesktop.setBounds(0,0,1019,723);// Cria Barra de Menu jmbBarraMenu=newJMenuBar();jmArquivo=newJMenu("Arquivo");jmiArquivoLogoff=newJMenuItem("Logoff");jmArquivo.add(jmiArquivoLogoff);jmiArquivoSair=newJMenuItem("Sair");jmArquivo.add(jmiArquivoSair);jmbBarraMenu.add(jmArquivo);jmCliente=newJMenu("Cliente");jmiClienteCadastro=newJMenuItem("Cadastro");jmCliente.add(jmiClienteCadastro);jmbBarraMenu.add(jmCliente);jmEstoque=newJMenu("Estoque");jmiEstoqueCadastro=newJMenuItem("Cadastro");jmEstoque.add(jmiEstoqueCadastro);jmiEstoqueCd=newJMenuItem("CD");jmEstoque.add(jmiEstoqueCd);jmiEstoqueDvd=newJMenuItem("DVD");jmEstoque.add(jmiEstoqueDvd);jmbBarraMenu.add(jmEstoque);jmFornecedor=newJMenu("Fornecedor");jmiFornecedorCadastro=newJMenuItem("Cadastro");jmFornecedor.add(jmiFornecedorCadastro);jmbBarraMenu.add(jmFornecedor);// Cria a janela. meuFrame=newJFrame("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 ListenerjmiClienteCadastro.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){//Define o look-and-feeltry{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(Exceptionex){ex.printStackTrace();}try{telaClienteCadastro=newTelaClienteCadastro();}catch(ParseExceptione){e.printStackTrace();}meuDesktop.add(telaClienteCadastro);telaClienteCadastro.setVisible(true);}});}});jmiEstoqueCadastro.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){//Define o look-and-feeltry{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(Exceptionex){ex.printStackTrace();}telaEstoqueCadastro=TelaEstoqueCadastro.getInstance();//telaEstoqueCadastro = new TelaEstoqueCadastro();meuDesktop.add(telaEstoqueCadastro);telaEstoqueCadastro.setVisible(true);}});}});jmiFornecedorCadastro.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventarg0){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){//Define o look-and-feeltry{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(Exceptionex){ex.printStackTrace();}telaFornecedorCadastro=newTelaFornecedorCadastro();meuDesktop.add(telaFornecedorCadastro);telaFornecedorCadastro.setVisible(true);}});}});}}
rugi
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
E
Eduardo_Henrique
telaEstoqueCadastro é um JInternalFrame.
rugi
telaFornecedorCadastro também?
E
Eduardo_Henrique
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.
Felagund
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.
E
Eduardo_Henrique
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(newActionListener(){publicvoidactionPerformed(ActionEventevent){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){//Define o look-and-feeltry{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());}catch(Exceptionex){ex.printStackTrace();}//Inicia o frame principalif(telaEstoqueCadastro==null){telaEstoqueCadastro=newTelaEstoqueCadastro();meuDesktop.add(telaEstoqueCadastro);telaEstoqueCadastro.setVisible(true);}elsetelaEstoqueCadastro.moveToFront();}});}});