Duvida sobre java.awt.EventQueue.invokeLater(new Runnable() {

qual a diferença quando eu chamo uma janela dentro de um formulario usando

java.awt.EventQueue.invokeLater(new Runnable() { public void run() { Pesquisa_Cliente pesquisa = new Pesquisa_Cliente(); pesquisa.setTexto(txtcliente.getText()); pesquisa.setObserver(observer); pesquisa.setCliente("sim"); pesquisa.setEmpresa(getEmpresa()); pesquisa.setVisible(true); } });

e chamar diretamente??

Pesquisa_Cliente pesquisa = new Pesquisa_Cliente(); pesquisa.setTexto(txtcliente.getText()); pesquisa.setObserver(observer); pesquisa.setCliente("sim"); pesquisa.setEmpresa(getEmpresa()); pesquisa.setVisible(true);

O comando java.awt.EventQueue.invokeLater

Coloca uma requisição (no caso, de abrir a janela) na Thread do Swing. Vai ser então a thread do swing que processa essa requisição.
Como o Swing não é thread-safe, essa é a forma correta de proceder, caso o seu comando de abrir a janela esteja vindo de outra thread (como o main, por exemplo).

Se você estiver dentro do código de um listener de botão, esse código já executa na thread do Swing. Até por isso a interface gráfica fica travada caso você faça ali um processamento muito pesado. Nesse caso, não seria necessário usar o comando, já que você já está na thread certa. A única diferença nesse caso é que usando o comando você deixará o processamento para depois da finalização do método.

1 curtida

O correto intão no evento de botão é não usar??

será por isso que minha tela as vezes trava?

Sim, no evento de botão não é necessário. Não faz mal nenhum usar, só não precisa.

Sua tela trava se vc colocar um processamento muito pesado diretamente no evento de botão. Nesse caso, você precisa disparar uma outra thread com um SwingWorker.

Boas pessoal!

Estáva a ler este tópico e fiquei curioso com este método.

Eu comecei a programar Java no netbeans á pouco tempo.

O método: java.awt.EventQueue.invokeLater irá bloquear a parte gráfica certo?

Mas se eu não quiser bloquear a parte gráfica como que eu faço?

Para perceberem melhor entrei neste topico:
http://www.guj.com.br/posts/list/15/213083.java

Abraço

Você faz um processamento pesado numa segunda thread. E deixa apenas atualizações de tela na thread do Swing. As atualizações de tela são feitas usando o comando java.awt.EventQueue.invokeLater.

Ou seja, sua thread faz todo processamento pesado, e só quando for pintar um status ou atualizar uma informação, faz a chamada a EventQueue.invokeLater. E, nessa chamada, inclui apenas o código necessário para essa atualização.

Dê uma olhada nesse tópico: http://www.guj.com.br/posts/list/52964.java#279083

Eu estava lendo o tópico sobre o java.awt.EventQueue.invokeLater que vc mandou vini, e fui testar no meu pc um dos códigos que vc postou e mesmo retirando o java.awt.EventQueue.invokeLater meu pc n teve problema na hora de renderizar a tela nem mesmo quando eu tirei o Thread.sleep(1000); (para forçar)

isso se deve talvez por eu ter copilado e executando usando o java 8 diferente da época do tópico ?

[quote=Victor Gerin]Eu estava lendo o tópico sobre o java.awt.EventQueue.invokeLater que vc mandou vini, e fui testar no meu pc um dos códigos que vc postou e mesmo retirando o java.awt.EventQueue.invokeLater meu pc n teve problema na hora de renderizar a tela nem mesmo quando eu tirei o Thread.sleep(1000); (para forçar)

isso se deve talvez por eu ter copilado e executando usando o java 8 diferente da época do tópico ?[/quote]

Não. Problemas com threads tem a infeliz característica de serem difíceis de reproduzir - por isso é muito importante tomar bastante cuidado.

O Swing, mesmo no Java 8, continua não sendo thread-safe, e o EventQueue.invokelater continua tendo que ser usado. Sem esse cuidado e com a quantidade diferente de SOs e arquiteturas de hardware que existem, certamente vai dar problema na máquina de algum dos seus clientes.

preciso de ajuda, usei um EventQueue.invokeLater(new Runnable() { para abrir uma tela, mas agora nao sei como fechar essa tela sem sair do programa, quero criar um botao onde sai dessa tela e a tela inicial fique aberta, igual eu fasso com um jframe assim this.dispose();

EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.setContentPane(new ListarFuncionarios());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });

pode me ajudar

Não tem nada a ver com o EventQueue.invokeLater.

O que está fechando o programa é o fato de você ter definido a operação de fechamento padrão (DefaultCloseOperation) para EXIT_ON_CLOSE. Troque por DISPOSE_ON_CLOSE.

Você tendo um

EventQueue.invokeLater(new Runnable() { public void run() {
em um método main para abrir um frame principal e este contendo um botão para abrir um frame2.

Na action do botão do frame principal se colocar

EventQueue.invokeLater(new Runnable() { public void run() {
para abrir o frame2, isto não criará uma outra thread, ou a JVM colocará tudo na thread de despacho de eventos?

[quote=Marcelo_Viana]Você tendo um

EventQueue.invokeLater(new Runnable() { public void run() {
em um método main para abrir um frame principal e este contendo um botão para abrir um frame2.

Na action do botão do frame principal se colocar

EventQueue.invokeLater(new Runnable() { public void run() {
para abrir o frame2, isto não criará uma outra thread, ou a JVM colocará tudo na thread de despacho de eventos?[/quote]

Vai colocar tudo na thread do Swing. Que é uma thread só.