Abrir só um vez o JInternalframe

13 respostas
O

Putz!!!
Gent ta dificil faze o meu Jinternalframe abrir só uma vez já usei variavel
para dizer quando ele já foi aberto mas não adianta.
Alguem ai sabe??? como ???

13 Respostas

D

O2:
Putz!!!
Gent ta dificil faze o meu Jinternalframe abrir só uma vez já usei variavel
para dizer quando ele já foi aberto mas não adianta.
Alguem ai sabe??? como ???

Use um design pattern chamado Singleton.
Abaixo segue um exemplo…Um abraço

public class Singleton {

private static Singleton singleton = new Singleton();

/** A private Constructor prevents any other class from instantiating. */

private Singleton() {

}
/** Static instance method */

public static Singleton getInstance() {

return singleton;

}

// other methods protected by singleton-ness would be here…

/** A simple demo method */

public String demoMethod() {

return demo;

}

}

Entendeu :?:

R

Amigo, eu estou com o mesmo problema, e eu n entendi muito bem o exemplo. Você poderia me explicar um pouco.
Pra contestualizar, eu estou desenvolvendo um softwre p controle de rebanho bovino, e tenho um JInternalFrame p controle de funcionários, FuncionarioJIF.
Como eu poderia fazer isso.
Tenho que usar o Singletron no meu JInternalFrame, ou na classe principal, que instancia o JInternalFrame?
Obrigado!!!

D

Olá !
Vc tem que usar na classe que instancia o seu internalFrame.

por exemplo:
[b]
JinternalFrame seuframe = null;

public JInternalFrame seuFrame(){

if seuframe.equals(null) {

seuFrame = newJInternalFrame() ;

}else{

return seuFrame;

}

}[/b]

ou algo parecido…fiz um método que busca todos os InternalFrames dentro do DeskTopPpane tbm…vou achar aqui e coloco o exemplo tbm.

D
O2:
Putz!!!!! Gent ta dificil faze o meu Jinternalframe abrir só uma vez já usei variavel para dizer quando ele já foi aberto mas não adianta. Alguem ai sabe??? como ???

Eu fiz deste jeito aqui
Criei uma classe abstrata que verifica se existe uma janela no desktopPane

/*
 * VerificaFrame.java
 *
 * Created on 7 de Maio de 2006, 10:39
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package controle;

import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;

/**
 * Esta é uma classe que irá verificar se existe frame no Desktop
 * @author ([email removido])
 */
public abstract class VerificaFrame {
    
    /** Creates a new instance of VerificaFrame */
    public VerificaFrame() {
    }
    
    public static Boolean verificaFrame(JDesktopPane jDesktopPane,JInternalFrame frame) {
        Boolean valor = false;       
        JInternalFrame[] results;
        results = jDesktopPane.getAllFrames();
        for (int i = 0 ; i &lt results.length ; i++){
           if( results[i].equals(frame) ){
              valor = true;
              break;
           }
       }
    return valor; 
   }

}
Dai eu testo no menu
private void jMenuItemCalculoCPPActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemCalculoCPPActionPerformed
    	if ( ! VerificaFrame.verificaFrame(jDesktopPane1,getCalculoCPP())){
            jDesktopPane1.add(getCalculoCPP()); 
            calculoCPP.setVisible(true);
        } else { 
            try{
            	calculoCPP.setSelected(true);
            }
            catch(Exception e){
            	calculoCPP.dispose();
            }
        }	
    }//GEN-LAST:event_jMenuItemCalculoCPPActionPerformed

T+ !

R

Olá amigo, me desculpa, mas eu não estou conseguindo fazer o JInternalFrame abrir só uma vez.
Implementei o seu exemplo, de VerificaFrame, mas abre vários a medida que clico no botão.
O que esse método getCalculoCpp() implementa?
Eu estou passando como parâmetro o desktopPane e o internalFrame instanciado.
Obrigado!!!

D

rumenigg:
Olá amigo, me desculpa, mas eu não estou conseguindo fazer o JInternalFrame abrir só uma vez.
Implementei o seu exemplo, de VerificaFrame, mas abre vários a medida que clico no botão.
O que esse método getCalculoCpp() implementa?
Eu estou passando como parâmetro o desktopPane e o internalFrame instanciado.
Obrigado!!!

Cara é o seguinte.
O getCalculoCpp() retorna um InternalFrame.
Você tem que passar como parametro a janela que vc vai verificar se está aberta no DesktopPane.

Vc não viu a assinatura do método?

public static Boolean verificaFrame(JDesktopPane jDesktopPane,JInternalFrame frame)

Você passa o DesktopPane e o InternalFrame

:arrow:

if ( ! VerificaFrame.verificaFrame(jDesktopPane1,getSeuInternalFrame())){

jDesktopPane1.add(getSeuInternalFrame());

SeuInternalFrame().setVisible(true);

} else {

try{

SeuInternalFrame().setSelected(true);

}

catch(Exception e){

SeuInternalFrame().dispose();

}

}

Qualquer coisa, coloca ai sua dúvida

Sigleton brother...... /** * @return Returns the calculoCPP. */ public CalculoCPP getCalculoCPP() { if(calculoCPP==null){ calculoCPP = new CalculoCPP(getValores()); } return calculoCPP; }

O

tentei apagar mas nao sei como faz. :stuck_out_tongue:
abaixo a “resposta” corrigida

O

e ae galera…

Penso que a solução mais interessante seria usar patterns, afinal são modelos testados e que funcionam.
Porém, não estou conseguindo implementar o Singleton.

da o seguinte erro :

Exception in thread “AWT-EventQueue-0” java.lang.IllegalArgumentException at org.netbeans.lib.awtextra.AbsoluteLayout.addLayoutComponent(Unknown Source)

codigo frame interno :

private static JIFrame frame = null;

public synchronized static JIFrame getJIFrame() {

if (frame == null){

frame = new JIFPacientes();

}

return frame;

}

========================
chamada no frame principal - DesktopFrame :

desktopPrincipal.add(JIFrame.getJIFrame());
JIFrame.getJIFrame().setVisible(true);

alguém poderiame ajudar ?

O

correção:

JIFPacientes > JIFrame

G

olá amigo eu faço assim:

//declaro uma referecia
 private meuFrame frame

//depois aonde chamo frame faço
public void actionPerformed...{
//se ele não foi criado
     if( frame == null ){
           frame = new frame();
           desktop.add( frame );
           frame.setVisible( true );
      }else{//se ele estiver criado
           if( frame.isVisible() ){
                frame.pack();//volta frame
           }else{
                 desktop.add( frame );//adicona frame ao JDesktopPane
                frame.setVisible( true );
           }
     }
}

ate

R

Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:

Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:

//ADICIONA TELAS (JInternalFrame) AO JDesktopPane
    // usado assim: this.addTelaDesk(new TelaFuncionarios(null));
    public void addTelaDesk(JInternalFrame tela){
        for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
            // se uma janela semelhante estiver aberta
            if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
                jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
                
                Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
                int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
                                                "Janela duplicada",
                                                JOptionPane.DEFAULT_OPTION,
                                                JOptionPane.QUESTION_MESSAGE,
                                                null,
                                                opções,
                                                opções[0]
                                        );
                // se utilizar a aberta retorna e não abre outra,
                // caso contrário sai do for e abre outra igual
                if(qst == 0){
                    return;
                }else if(qst == 1){
                    break;
                }
            }
        }

        this.telaDesktop.add(tela); //adiciona na tela
        tela.setVisible(true); // seta visivel
        this.cascade(); //coloca em cascata para deixar "pratico"
    }

A função para colocar em cascata:

private void cascade() {
        JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
        Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
        int separation = 25; // distancia entre as janelas

        // Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
        int i = desk.getAllFrames().length; // quantidade de frames
        for (JInternalFrame f : desk.getAllFrames()) {
            f.setLocation(i*separation, i*separation);
            i--; //mutiplicador
        }
    }

Exemplos de como chamar depois:

this.addTelaDesk(new TelaFuncionarios(null));

String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));

Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!

Abraços

V

Precisava ressuscitar 3 tópicos antigos para dizer isso?

R

É né, achei que poderia ajudar mais…
sou novo no forum, da próxima posto em mais de um só se for recente…

abs

Criado 11 de abril de 2006
Ultima resposta 21 de set. de 2010
Respostas 13
Participantes 7