[Resolvido] Não abrir outro JInternalFrame quando o mesmo já estiver Minimizado

3 respostas Resolvido
programaçãojava
M

Boa tarde a todos, estou corrigindo uns bugs do sistema que estou fazendo para um trabalho da faculdade e um deles não estou conseguindo revolver, já pesquisei bastante e não achei nada que desse um jeito nisso.
Segue o código que inicia o form :

// Chama tela de serviço com OS no numero    
        if (telaServico == null) {
            telaServico = new TelaServico();
            telaServico.gerarNumeroServico();      //método de criar o numero da ordem de serviço
            TelaServico.txtStatus.setText("Aberto");
            TelaServico.txtUsuarioNovoServico.setText(lblUsuario.getText());
            TelaServico.PK_usuario.setText(txtPKUsuarioLogado.getText());
            if (telaServico.isIcon()) {
                try {
                    telaServico.setIcon(false);
                } catch (PropertyVetoException ex) {
                    Logger.getLogger(TelaSelecaoServico.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else {
                telaServico.toFront();
            }
        }
        AdminIFrame.mostrarJanela(TelaSistema.Desktop, telaServico);

Código do método (mostrar janela) que adiciona o form no Desktop:

public static void mostrarJanela(JDesktopPane dp,JInternalFrame janela){
        if(janela !=null && !janela.isShowing()){
            janela.show();
            dp.remove(janela);
            try {
                dp.add(janela, JLayeredPane.DEFAULT_LAYER);
            
            } catch (IllegalArgumentException ex) {
                dp.add(janela, JLayeredPane.DEFAULT_LAYER);
            }   
        }
        if(janela == null){
            dp.add(janela, JLayeredPane.DEFAULT_LAYER);   
        }
        ativarJanela(dp, janela);    
    }

Ele ta funcionando ok ao que diz respeito a não abrir outro form igual. O problema é se eu abro 1, minimizo ele e abro outro, se eu só fechar ok Nada acontece e não tem nenhum form no Desktop mas se eu minimizo de novo ele trava o sistema todo e solta exception :

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: illegal component position
	at java.awt.Container.addImpl(Container.java:1098)
	at javax.swing.JLayeredPane.addImpl(JLayeredPane.java:231)
	at javax.swing.JDesktopPane.addImpl(JDesktopPane.java:484)
	at java.awt.Container.add(Container.java:415)
	at javax.swing.DefaultDesktopManager.deiconifyFrame(DefaultDesktopManager.java:221)
	at javax.swing.plaf.basic.BasicInternalFrameUI.deiconifyFrame(BasicInternalFrameUI.java:603)
	at javax.swing.plaf.basic.BasicInternalFrameUI$Handler.propertyChange(BasicInternalFrameUI.java:1422)
	at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
	at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
	at java.awt.Component.firePropertyChange(Component.java:8422)
	at javax.swing.JInternalFrame.setIcon(JInternalFrame.java:950)
	at javax.swing.plaf.basic.BasicInternalFrameTitlePane$IconifyAction.actionPerformed(BasicInternalFrameTitlePane.java:668)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2346)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
	at java.awt.Component.processMouseEvent(Component.java:6525)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6290)
	at java.awt.Container.processEvent(Container.java:2234)
	at java.awt.Component.dispatchEventImpl(Component.java:4881)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4533)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
	at java.awt.Container.dispatchEventImpl(Container.java:2278)
	at java.awt.Window.dispatchEventImpl(Window.java:2750)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.awt.EventQueue$4.run(EventQueue.java:729)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Obrigado desde já.

3 Respostas

S

Seu código parece bem confuso

public static void mostrarJanela(JDesktopPane dp,JInternalFrame janela){
        if (janela !=null && !janela.isShowing()) { // se a janela não está sendo exibida
            janela.show(); // exibe
            dp.remove(janela);  //  remove ela???????
            try {
                dp.add(janela, JLayeredPane.DEFAULT_LAYER); //  tenta adicionar novamente
            
            } catch (IllegalArgumentException ex) {
                dp.add(janela, JLayeredPane.DEFAULT_LAYER); // e tenta de novo o que  não deu certo
            }   
        }
        if (janela == null) { // se a variável não foi inicializada
            dp.add(janela, JLayeredPane.DEFAULT_LAYER); // tenta adicionar null ????  
        }
        ativarJanela(dp, janela); // qual a diferença entre abrir com o show e usar esse ativar Janela ???
}
M

então, esse método foi um que achei em um fórum quando eu estava pesquisando como adicionar um Internalframe ao desktop, agora que li seus comentários nele realmente parece confuso. Eu vou tentar ajeitar ele ou não usa-lo para ver se para esse erro exception .

Obrigado por comentar.

S
Solucao aceita

Em principio você só deveria adicionar cada JInternalFrame uma unica vez ao JDesktopPane e utilizar o método setVisible(true) para exibir e setVisible(false) para ocultar.

Criado 19 de novembro de 2016
Ultima resposta 20 de nov. de 2016
Respostas 3
Participantes 2