Dúvida com Frame [Resolvido]

7 respostas
leoviniga

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

7 Respostas

visola

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.

leoviniga

vlw era bem isso mesmo…vo tenta implementa aqui :slight_smile:

mews
Seguindo a linha de raciocínio do nosso amigo visola, segue um exemplo que eu fiz rapidinho :D
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);
	}
}
Existem outras formas para resolver isso e até formas mais elegantes. Agora vai de você estudar e refatorar o código.

Valew

leoviniga

saquei…valeu aí,ajudaram pra caramba :smiley:

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;

visola

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).

leoviniga

Sim enquanto eu tava implementando eu vi o método nomeAquivo.deleteOnExit();

que já faz isso automaticamente

visola

Verdade, tinha esquecido desse daí!
Mais fácil ainda! :wink:

Criado 11 de janeiro de 2011
Ultima resposta 11 de jan. de 2011
Respostas 7
Participantes 3