Thread

6 respostas
G

Bom dia,

Alguém sabe porque e que quando eu corro este código em modo debug funciona mas quando corro normal as letras não aparecem?

Borigado

public class Servidor extends JFrame implements Runnable {
    JLabel l;
    JPanel p;
    Font font = new Font("Arial", Font.BOLD, 40);
    boolean teste = false;

    public Servidor() {
        p = new JPanel();
        l = new JLabel();
        l.setFont(font);
        l.setForeground(Color.BLACK);

        JButton bt = new JButton("START");

        bt.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                teste = true;
            }
        });
        p.add(bt);
        p.add(l);
        add(p);

        setVisible(true);
        setTitle("l");
        setSize(300, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public void run() {
        while (true) {
            if (teste) {
            for (int i = 65; i <= 90; i++) {
                try {

                    l.setText("" + (char) i);

                    Thread.sleep(2000);

                } catch (InterruptedException ex) {
                    Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            }
        }
    }
    
    public static void main(String[] args) {
        Servidor ser = new Servidor();
        new Thread(ser).start();

    }
}

6 Respostas

E

nao sei se é isso mas seu codigo esta faltando um break para parar o loop

G

Boa Noite,

Não o problema não é esse

Obrigado

prog.tiago

Bom dia Guilherme,

Pelo que percebi o seu código não está gerando a exibição das letras por causa do trecho

if (teste) { for (int i = 65; i <= 90; i++) { try {

Você pediu para entrar no for apenas se teste==true, no entanto lá em cima você inicializou a variável teste como false.

boolean teste = false;

Abraços :smiley:

A

prog.tiago
Ele setou para true aqui.

public void actionPerformed(ActionEvent e) { teste = true; }
elton santos,
Testei seu código aqui e ele funcionou perfeitamente… Mostrando as letras…

Att

prog.tiago

Astork, eh verdade... Ele setou como true portanto deveria funcionar.

No entanto a minha JVM também não executou da forma esperada.

Percebi que se eu forçar um processamento no início do run(), funciona. Por exemplo:

public void run() {
		
		while (true) {
			System.out.println("esse código com certeza será executado!!!");
			if (teste==true) {
				for (int i = 65; i <= 90; i++) {
					try {

						l.setText("" + (char) i);

						Thread.sleep(2000);

					} catch (InterruptedException ex) {
						Logger.getLogger(Servidor.class.getName()).log(
								Level.SEVERE, null, ex);
					}
				}
			}
		}
	}

Nesse caso funciona. Mas não eh assim que resolveremos o problema hehe. :D

Como sugestão, coloque a criação da Thread no ActionListener do botão.
No meu caso funcionou...

JButton bt = new JButton("START");

		bt.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				System.out.println("executado!");
				System.out.println(teste);
				teste = true;
				new Thread(Servidor.this).start();
			}
		});
public static void main(String[] args) {
		Servidor ser = new Servidor();
	}

Acredito que o problema que o Guilherme passou e que tbm está ocorrendo comigo seja devido à JVM. Pois como sabemos não podemos obrigar o momento em que a Thread será executada por ela.

Se alguém puder dar mais explicações, agradeço. :)

G

Boa Noite,

Já tinha resolvido, fiz como o prog.tiago falou.

Muito obrigado,

Criado 27 de fevereiro de 2011
Ultima resposta 1 de mar. de 2011
Respostas 6
Participantes 4