Verificar jinternalframe

13 respostas
L

Olá pessoal!!!

Essa é a forma que eu abro um jinternalframe no jdesktoppane. O que quero saber é como faço para não abrir ele novamente caso ele já esteja aberto.

private void GER001CadastroUsuarios (java.awt.event.ActionEvent evt) throws ParseException{
        GER001CadastroUsuarios usuarios = new GER001CadastroUsuarios();
        this.desktopPane1.add(usuarios);
        usuarios.setLocation(10, 10);
        usuarios.setVisible(true);

Obrigado pela força.

Luís Fernando Schneiders

13 Respostas

ViniGodoy

Transforme a variável usuários numa propriedade, e então:

private void GER001CadastroUsuarios (java.awt.event.ActionEvent evt) throws ParseException{ if (usuarios != null) { usuarios = new GER001CadastroUsuarios(); this.desktopPane1.add(usuarios); usuarios.setLocation(10, 10); usuarios.setVisible(true); } }

Só lembre de setar usuários para null quando o JInternalFrame for fechado.

L

ViniGodoy:
Transforme a variável usuários numa propriedade, e então:

private void GER001CadastroUsuarios (java.awt.event.ActionEvent evt) throws ParseException{ if (usuarios != null) { usuarios = new GER001CadastroUsuarios(); this.desktopPane1.add(usuarios); usuarios.setLocation(10, 10); usuarios.setVisible(true); } }

Só lembre de setar usuários para null quando o JInternalFrame for fechado.

Como assim numa propriedade?

altitdb

Cara…

eu faço assim…

if(internal.isVisible()){
internal.moveToFront();
}

Se ele for visivel ele joga na tela!!
porque vc pode ter mais abertos no momento.

xD~~

L

altitdb:
Cara…

eu faço assim…

if(internal.isVisible()){
internal.moveToFront();
}

Se ele for visivel ele joga na tela!!
porque vc pode ter mais abertos no momento.

xD~~

Olá altitdb

Fiz o seguinte teste. Mas ele não vai para o usuarios.moveToFront(); depois que já tenho está tela aberta.

O que será que pode ser isso?

private void GER001CadastroUsuarios (java.awt.event.ActionEvent evt) throws ParseException{
        GER001CadastroUsuarios usuarios = new GER001CadastroUsuarios();
        this.desktopPane1.add(usuarios);
        try {
            if(usuarios.isVisible()== true){
                usuarios.moveToFront();

            }
            usuarios.setVisible(true);
            }
        catch (Exception e) {
            usuarios.setVisible(true);
        }
altitdb

O Porque eu não sei…

eu sempre faço um metodo para jogar os Internais…

tipo…

void mostrar(JInternalFrame j){
if(j.isVisible()==true){
j.moveToFront();
}else{
j.setVisible(true);
}
}

mostrar(meuInternal);
L
altitdb:
O Porque eu não sei...

eu sempre faço um metodo para jogar os Internais...

tipo...

void mostrar(JInternalFrame j){
if(j.isVisible()==true){
j.moveToFront();
}else{
j.setVisible(true);
}
}


mostrar(meuInternal);

Amigo, obrigado pela ajuda, mas não consigo desta forma.

Abraço.

Luís Fernando Schneiders

R

altitdb:
O Porque eu não sei…

eu sempre faço um metodo para jogar os Internais…

tipo…

void mostrar(JInternalFrame j){
if(j.isVisible()==true){
j.moveToFront();
}else{
j.setVisible(true);
}
}

mostrar(meuInternal);

Isso é gambiarra. Segue o conselho do ViniGodoy e faz a verificação utilizando o null.

JANELA_FECHADA == NULL

JANELA_VISÍVEL == isVisible();

Aqui tu não só fez uma gambiarra como provocou o suicídio de três engenheiros da Sun MicroSystems.

Capturar uma Exception dessa forma é muito feio.

L

Olá r4it0.light.

Certo fiz deste modo:
// variável de instância  
private GER001CadastroUsuarios usuarios;  
  
// método  
private void GER001CadastroUsuarios (java.awt.event.ActionEvent evt) throws ParseException{     
    if (usuarios == null) {  
        usuarios = new GER001CadastroUsuarios();     
        this.desktopPane1.add(usuarios);     
        usuarios.setLocation(10, 10);  
    }  
    usuarios.setVisible(true);    
}

Mas me responde outra dúvida. Como faço para setar o usuarios como null no botão SAIR do Jinternalframe para assim acessar novamente esse jinternalframe?

Obrigado pela atenção.

Luís Fernando Schneiders

altitdb

r4it0.light:
altitdb:
O Porque eu não sei…

eu sempre faço um metodo para jogar os Internais…

tipo…

void mostrar(JInternalFrame j){
if(j.isVisible()==true){
j.moveToFront();
}else{
j.setVisible(true);
}
}

mostrar(meuInternal);

Isso é gambiarra. Segue o conselho do ViniGodoy e faz a verificação utilizando o null.

JANELA_FECHADA == NULL

JANELA_VISÍVEL == isVisible();

Aqui tu não só fez uma gambiarra como provocou o suicídio de três engenheiros da Sun MicroSystems.

Capturar uma Exception dessa forma é muito feio.

hehehe… Só 3?? ^^

a Exception… eu tava com pressa e escrevi correndo!!

eu sempre trato elas de forma diferente!!

xD~~

L

Olá pessoal!!!

Depois de alguns dias levando um laço consegui o que precisava, que era fazer um teste com os jinternalframe. Abrir somente um e depois de fechado conseguir abrir ele novamente. Abaixo o modelo:

Na class que extende o JFrame tive que colocar:

public class TelaPrincipal extends JFrame implements ActionListener
{
    static GER001CadastroUsuarios cusuarios;
    static GER002CadastroBancos cbancos;
    static GER003CadastroDespesas cdespesas;
    static GER004LancamentoBancos lbancos;
    static GER005LancamentoDespesas ldespesas;

e para o testar se o jinternalframe já estava aberto

public void GER001CadastroUsuarios (java.awt.event.ActionEvent evt) throws ParseException, PropertyVetoException{
        if (cusuarios == null) {
            cusuarios = new GER001CadastroUsuarios();
            this.desktopPane1.add(cusuarios);
            cusuarios.setLocation(10, 10);
        }
            cusuarios.moveToFront();
            cusuarios.setVisible(true);
    }

e no botão sair do JinternalFrame

private void botaoSairActionPerformed (java.awt.event.ActionEvent evt){
        TelaPrincipal.cusuarios = null;
        this.dispose();
        
    }

Obrigado a todos

Abraços.

Luís Fernando Schneiders

rcipriani

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

ViniGodoy

Precisava ressuscitar 3 tópicos antigos para dizer isso?

rcipriani

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

Criado 16 de janeiro de 2010
Ultima resposta 21 de set. de 2010
Respostas 13
Participantes 5