Abrir só um vez o JInternalframe

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 ???

[quote=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 ???[/quote]

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 :?:

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!!!

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.

[quote=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 ???[/quote]

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

[code]
/*

  • 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 (dsfextreme@pop.com.br)
    */
    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;
    }

}[/code]

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+ !

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!!!

[quote=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!!![/quote]

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; }

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

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 ?

correção:

JIFPacientes > JIFrame

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

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

Precisava ressuscitar 3 tópicos antigos para dizer isso?

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

abs