Olá pessoas…Alguém poderia me dizer como eu faço pra um Jframe X só abrir 1 vez? Caso contrário ele vai manda uma mensagem dizendo ao usuário que X já está em execução
Se for dentro da mesma aplicação, pode usar uma variável estática para armzenar a instância que já existe e mostrar para o usuário quando ele tentar abrir outra.
Se for tipo o Firefox que diz que uma instância está rodando caso o usuário tente abrir o programa duas vezes, pode fazer isso com um arquivo de lock.
Na hora que abrir a aplicação, cria um arquivo numa pasta específica com um nome específico, aí quando sair da aplicação, apagar o arquivo. Não precisa ter nada dentro.
E aí, toda hora que a aplicação abrir, antes de abrir o frame, procura pelo arquivo, se existir, mostra o dialog avisando o usuário que a aplicação já está aberta e sai.
Se não existir, abre normalmente.
vlw era bem isso mesmo…vo tenta implementa aqui
Seguindo a linha de raciocínio do nosso amigo visola, segue um exemplo que eu fiz rapidinho
[code]import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class FrameTeste extends JFrame
{
private static final long serialVersionUID = 1L;
private JButton botaoNovaTela = new JButton();
static boolean telaEstaAberta = false;
JFrame novaTela;
public FrameTeste()
{
super("Tela de Teste");
this.montaJanela();
}
public boolean criarUmaNovaTela()
{
if (telaEstaAberta)
return false;
else
{
telaEstaAberta = true;
novaTela = new JFrame();
novaTela.setSize(640, 480);
novaTela.setVisible(true);
//evento que trata quando a tela eh finalizada
novaTela.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent winEvt) {
telaEstaAberta = false;
}
});
return true;
}
}
private void montaJanela()
{
this.getContentPane().add(botaoNovaTela);
botaoNovaTela.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
//cria uma nova tela
if (!criarUmaNovaTela())
JOptionPane.showMessageDialog(null, "A tela ja esta aberta");
}
});
}
public static void main(String[] args)
{
FrameTeste janela = new FrameTeste();
janela.setSize(640, 480);
janela.setVisible(true);
}
}
[/code]
Existem outras formas para resolver isso e até formas mais elegantes.
Agora vai de você estudar e refatorar o código.
Valew
saquei…valeu aí,ajudaram pra caramba
o método que cria/deleta o arquivo.txt pra só abrir uma intância do programa eu consegui fazer sozinho usando java.io.File;
Só um alerta, cuidado com isso porque se esquecer de apagar o arquivo em alguma saída do seu programa, o usuário nunca mais vai conseguir abrí-lo, a não ser que ele mesmo apague o arquivo na mão. Por isso, cuidado com exceções inesperadas.
Eu sugiro criar um hook para ele apagar o arquivo automaticamente quando a máquina virtual terminar:
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run () {
// Apaga o arquivo aqui
}
});
Pode colocar isso no método main que inicializa a aplicação.
Nesse caso, o arquivo só vai continuar lá se a máquina virtual morrer por falha (ABEND).
Sim enquanto eu tava implementando eu vi o método nomeAquivo.deleteOnExit();
que já faz isso automaticamente
Verdade, tinha esquecido desse daí!
Mais fácil ainda!