Problema com o setLocationRelativeTo e outras dúvidas

Dúvida 1:

Tava vendo uma discussão gerada em um tópico antigo sobre a questão de como abrir um JFrame no meio da tela. Vi que muitos recomendaram o seguinte método:

this.setLocationRelativeTo(null);

Tentei usar esse método, mas o problema é que eu possuo algumas mensagens de Warning que aparecem pro usuário na validação de alguns campos, e quando essa mensagem aparece ela fica atrás do frame setado com o método setLocation… .

Como eu o deixo acima da janela?

Dúvida 2:

Tenho uma tela inicial de configuração do usuário que sempre que o programa é aberto pela primeira vez, essa tela de configuração é exibida e o usuário não pode sair dela até configurar tudo certinho. O grande problema é que eu faço essa validação com While, e se eu ficar chamando o método pra exibir o JFrame dá pau. O meu programa simplesmente trava ou então fica dando minha mensagem de erro repetidas vezes (repassando pelo While).

Eu faço o seguinte:

While (Main.objUserProfile.getTimeZone().isEmpty()){
objUserSettings.setVisible();
}

PS: O “TimeZone é configurado no UserSettings”.

Dúvida 3:

Como faço pra uma janela ser aberta somente 1 vez? É que no menu que dá pra chamar outras JFrames, se eu clicar em 1 JFrame dá pra eu continuar chamando ele repetidas vezes.

Dúvida 1:

Para abrir no centro da tela eu recomendaria

 RefineryUtilities.centerFrameOnScreen(nomedoframe);
frame.setVisible(true);

Dúvida 2:

Você pode tornar a tela MODAL (não permitir que ele clique em outro lugar) e caso ele não configure certo fique informando o erro.

Dúvida 3:

Bom voce pode ficar testando a condição se

if (seuFrame.isVisible){ }else{ }

Bom espero ter te ajudado.

Valeu

Ahh, entendi. Mas como eu a configuro como MODAL?

Tentar limitar com o if/else eu já tinha tentado, mas não consegui. Continua abrindo da mesma maneira.

Tenta isso.

        seuFrame.setAlwaysOnTop(true);
        seuFrame.toFront();

[quote=fabricioempresa]Tenta isso.

seuFrame.setAlwaysOnTop(true); seuFrame.toFront(); [/quote]

O SetAlwaysOnTop e o toFront eu já tenho no código, mesmo assim se eu clicar no botão que chama o evento do JFrame ele chama ele inúmeras vezes na medida em que clicado. :confused:

Oi,

[quote]Dúvida 1:

Tava vendo uma discussão gerada em um tópico antigo sobre a questão de como abrir um JFrame no meio da tela. Vi que muitos recomendaram o seguinte método:

this.setLocationRelativeTo(null);

Como eu o deixo acima da janela?
[/quote]

Se não estou enganada, o método setLocationRelativeTo aceita um JComponent por parâmetro como referência. Ou seja, vc pode passar o Componente em que gostaria que sua janela centralizasse.
O problema, não está nesse método e sim em suas Janelas Warning. Que tipo de janela elas são? JFrame? JDialog? Recomendaria o uso de um JDialog com setModal(true) ou então utilizar o método setAlwaysOnTop(true).

Essa janela deverá ser do tipo JDialog e utilizar a opção setModal(true);

Exemplo:

if (frame == null) { frame = new JFrame(); frame.setVisible(true); } else { System.out.println("Janela já ativa"); }

Tchauzin!

Ahh sim, funcionaram a maioria das dicas, muito obrigado. Mas ainda tenho um probleminha:

Quando eu seto pra uma janela sobrepor a outra e a do fundo ficar inativa, quando eu fecho a janela que ficava encima, a de trás trava, e não dá pra mexer mais, então eu botei o setEnable(true); novamente pra ativa-la, mas o grande problema disso tudo é que se eu tiver com outros programas aberto, o meu programa em java vai lá pra trás de todas as outras janelas, tenho que ir na barra de ferramentas do windows e traze-la para a frente novamente. Tentei alguns comandos mas eles não funcinaram. Vocês sabem de algum?

Agradeço des de já.

Alguém?

Outro problema chato tá sendo um loop que to fazendo pra uma janela ficar aberta.

                    while(Main.objUserProfile.getTimezone().isEmpty()){
                        //Chama a tela de configuração
                        if (!objUserSettings.isActive()){
                            objUserSettings.setVisible(true);
                        }
                    }

Às vezes essa janela de configuração trava. :confused:

Não tem como eu exibir a janela e fazer com que o Loop trave enquanto ela estiver aberta?

Caro ElvisCamilo,

Este loop é realmente importante. Você não poderia substituir e colocar um button na tela para o usuario clicar quando terminar de digitar tudo, e ai entao voce faz a validação.

[quote=willCesar]Caro ElvisCamilo,

Este loop é realmente importante. Você não poderia substituir e colocar um button na tela para o usuario clicar quando terminar de digitar tudo, e ai entao voce faz a validação.[/quote]

Mas e se o cara resolver clicar em cancelar ou algo assim? O problema é que essa janela pode ser aberta por uma outra parte do programa. Se eu não fizer um loop assim com ela, vou ter que criar uma janela com validações só pra primeira abertura.

[quote=ElvisCamilo]Outro problema chato tá sendo um loop que to fazendo pra uma janela ficar aberta.

                    while(Main.objUserProfile.getTimezone().isEmpty()){
                        //Chama a tela de configuração
                        if (!objUserSettings.isActive()){
                            objUserSettings.setVisible(true);
                        }
                    }

Às vezes essa janela de configuração trava. :confused:

Não tem como eu exibir a janela e fazer com que o Loop trave enquanto ela estiver aberta?[/quote]

Oi,

Já pensou em utilizar Thread?

Tchauzin!

[quote=ElvisCamilo]Ahh sim, funcionaram a maioria das dicas, muito obrigado. Mas ainda tenho um probleminha:

Quando eu seto pra uma janela sobrepor a outra e a do fundo ficar inativa, quando eu fecho a janela que ficava encima, a de trás trava, e não dá pra mexer mais, então eu botei o setEnable(true); novamente pra ativa-la, mas o grande problema disso tudo é que se eu tiver com outros programas aberto, o meu programa em java vai lá pra trás de todas as outras janelas, tenho que ir na barra de ferramentas do windows e traze-la para a frente novamente. Tentei alguns comandos mas eles não funcinaram. Vocês sabem de algum?

Agradeço des de já.[/quote]

Oi,

Já tentou executar novamente o método setVisible(true) ?

Tchauzin!

Caro ElvisCamilo,

Se este laço é realmente importante, acredito que com thread voce vai comseguir solucionar o seu problema, estuda um pouco, acho que vai resolver o seu problema.

Bem, depois de ler as dicas de vocês e finalmente ler a documentação de alguns métodos do java, eu consegui realmente o que queria. Vou postar aqui as soluções para futuras buscas:

Pro caso do For, não teve jeito, tive de criar outra classe só para as configurações iniciais do usuário e fazendo a validação dos dados, para que ele não digite coisa errada lá, quando tudo está certinho, ele abre a janela principal e só aparece se o arquivo do usuário for apagado.

O caso das janelas ficarem “por cima”, eu apenas mudei o tipo de herança das classes. Ao invés de JFrame, coloquei JDialog, e no corpo da Classe eu setei o Classe.setModal(true); e funcionou o que eu queria. :slight_smile: