JFrame Travado[resolvido]

5 respostas
Rafael17

Olá pessoal.

Alguém poderia me dizer o que está de errado no meu projeto, porque toda vez que eu executo a classe Main e depois por ela eu executo a classe Make ele trava totalmente.
E se eu executo a classe Make ele roda normal.
Aqui estão as duas classes:

package t;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.UIManager;

public class Main extends JFrame {

    private Container c = getContentPane();

    public Main() {
        setExtendedState(MAXIMIZED_BOTH);
        setUndecorated(true);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

    public void inicializa() {
        setVisible(true);
        c.setLayout(new GroupLayout(c));
        add();
        menu();
    }

    private void menu() {
        novo.add(criar);
        novo.add(sair);
        bar.add(novo);
        setJMenuBar(bar);
        metodosMenu();
    }

    private void metodosMenu() {
        criar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
                Make m = new Make();
                m.inicializa();
            }
        });
        sair.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
    }

    private void add() {
        c.add(novo);
        c.add(criar);
        c.add(sair);
        c.add(bar);
    }

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            Main principal = new Main();
            principal.inicializa();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
    private JMenu novo = new JMenu("Novo");
    private JMenuItem criar = new JMenuItem("Criar");
    private JMenuItem sair = new JMenuItem("Sair");
    private JMenuBar bar = new JMenuBar();
}
package t;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

public class Make extends JFrame {

    private BufferedImage buffer = new BufferedImage(1370, 746, BufferedImage.TYPE_INT_RGB);
    public static int campo[][] = new int[50][50];

    public Make() {
        setExtendedState(MAXIMIZED_BOTH);
        setUndecorated(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void grafico() {
        Graphics g = getGraphics();
        Graphics gg = buffer.createGraphics();
        g.drawImage(buffer, 0, 0, this);
        gg.dispose();
        g.dispose();
    }

    public void inicializa() {
        setVisible(true);
        loop();
    }

    private void loop() {
        while (true) {
            try {
                Thread.sleep(1000 / 9);
                grafico();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }

    public static void main(String[] args) {
        Make m = new Make();
        m.inicializa();
    }
}

Desde já agradeço…

5 Respostas

ViniGodoy

O swing opera numa thread, que faz o seguinte:

while (true) { trataEventos(); repintaATela(); }

Se você dispara o Make no método onClick do botão, e então roda o loop, a thread do swing irá ficada no método trataEventos(), que foi quem disparou o evento do botao. E assim, não se repintará.

Para resolver esse problema, é necessário controlar o loop numa thread secundária.

Rafael17

Desculpa Vini, mas eu não entendi muito bem, você poderia explicar de uma outra forma ? E dar um exemplo de como resolver o problema ?

Obrigado.

ViniGodoy

Troque a linha 28 da classe Make de:

para:

new Thread(new Runnable() { @Override public void run() { loop(); } }).start();

ViniGodoy

Para outra explicação, leia:
http://www.pontov.com.br/site/index.php/java/47-javageral/92-conhecendo-o-jframe

Rafael17

Muito obrigado ViniGodoy.

Você conseguiu resolver um problema que nem o melhor dos meus professores de Java conseguiu.

Agora posso dar continuidade no meu projeto :slight_smile:

Abraços

Criado 15 de novembro de 2012
Ultima resposta 15 de nov. de 2012
Respostas 5
Participantes 2