Gostaria de saber qual o melhor ou mais usado metodo/classe pra fazer o programa dar uma pausa, seria o thread, timer, ou outro?
Qual o melhor método/classe pra esperar?
9 Respostas
Qual tipo de pausa? Aquela que bloqueia totalmente o uso do programa ou que permite que outras operações continuem rodando “normalmente”?
Até!
se vc me falar qual eh melhor pra cada situacao melhor ainda, mas meu problema atual eh o d recarregar imagens em um loop, tipo
for(int i =0; i<10; i++){
carregaimagem(i);
melhorjeitode parar();
}
Antes de poder aconselhar melhor, temos que saber: as imagens tem que ser recarregadas uma a uma ou podem ser simultaneamente? O método carregaimagem() bloqueia a operação? O que você precisa é que espere um tempo (tipo 2 segundos) ou só continue a rodar depois que terminou de carregar? A parada é total ( ou seja, o sistema congela ) ou é parcial ( somente uma parte do sistema para )?
Até!
bom entao eu vo especificar...
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class InterfaceGrafica extends JFrame {
protected JPanel painelPrincipal;
protected Vector<Casas> casas;
protected Color cor;
protected int ultimox, ultimoy;
public InterfaceGrafica() {
casas = new Vector<Casas>();
painelPrincipal = new JPanel();
painelPrincipal.setLayout(new GridLayout(8, 8));
ultimox = 0;
ultimoy = 0;
for (int i = 0; i < 64; i++) {
casas.add(new Casas());
casas.get(i).addMouseListener(new MouseListener() {
public void mouseEntered(MouseEvent e) {
cor = e.getComponent().getBackground();
e.getComponent().setBackground(Color.YELLOW);
}
public void mouseExited(MouseEvent e) {
e.getComponent().setBackground(cor);
}
public void mouseClicked(MouseEvent e) {
for (int i = 0; i <= ((Casas) e.getComponent())
.getPosicaoY(); i++) {
for (int j = 0; j <= ((Casas) e.getComponent())
.getPosicaoX(); j++) {
cor = casas.get(i * 8 + j).getBackground();
casas.get(i * 8 + j).setBackground(Color.RED);
try {Thread.sleep(50);} catch
(InterruptedException e1)
{System.out.println("deu erro");}
casas.get(i*8 +j).setBackground(cor);
}
}
ultimox = ((Casas) e.getComponent()).getPosicaoX();
ultimoy = ((Casas) e.getComponent()).getPosicaoY();
System.out.println("x: " + ultimox + "\ny: " + ultimoy);
}
public void mousePressed(MouseEvent arg0) {
}
public void mouseReleased(MouseEvent arg0) {
}
});
if (((((i < 8) | ((i > 16) & (i < 24)) | ((i > 32) & (i < 40)) | ((i > 48) & (i < 56))) & (i % 2 == 1)))
| (((((i > 7) & (i < 15)) | ((i > 23) & (i < 31))
| ((i > 39) & (i < 47)) | (i > 55)) & (i % 2 == 0)))) {
casas.get(i).setBackground(Color.BLACK);
} else {
casas.get(i).setBackground(Color.WHITE);
}
}
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
painelPrincipal.add(casas.get(i * 8 + j));
casas.get(i * 8 + j).setX(j);
casas.get(i * 8 + j).setY(i);
}
}
add(painelPrincipal);
setSize(400, 400);
setLocation(300, 150);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
InterfaceGrafica jogo = new InterfaceGrafica();
}
}
public class Casas extends JPanel {
private int x, y;
public Casas() {
}
public void setX(int x) {
this.x = x;
}
public void setY(int y) {
this.y = y;
}
public int getPosicaoX() {
return this.x;
}
public int getPosicaoY() {
return this.y;
}
}
minha intensao com esse codigo era q clicando em uma determinada casa, as casas fosse piscando da (0,0) ate a q eu cliquei.
mas nao ta dando certo, as casas piscam o tempo corre mas isso nao aparece na tela.
comentando a linha 49 da pra ve q tudo acontece, so q d uma vez so. esse eh o meu problema
O seu problema é que todo aquele código roda na thread do Swing.
O código roda inteiro e, só quando sai de lá, a execução irá de volta para o swing que irá mandar repintar a tela.
A solução para o seu problema é disparar o código numa Thread diferente. Se estiver usando Java 6 ou superior, olhe a classe SwingWorker:
http://java.sun.com/docs/books/tutorial/uiswing/concurrency/
Se for antes disso, use a classe Thread para criar uma nova Thread.
E o método EventQueue.invokeLater para comandar as trocas de cores.
nao era pra um rapaint() funcionar?
Não, o repaint vai enfileirar na fila de mensagens do Swing uma mensagem de repaint. Essa mensagem só vai ser processada quando a thread do Swing for liberada, ou seja, após o seu método.
Não tem jeito, ou vc usa threads separadas, ou vc nunca vai ver nada se mexendo.
ok entao, mas sem quere ser chato vc pode me dar um exemplo de threads separadas, pq eu nao sei como fazer. Nao precisa ser nesse codigo nao talvez se for um outro eh ate melhor pra eu entender vlw
Você chegou a olhar o link que eu passei ali em cima? Lá tinha explicação e exemplos.
Se quiser algo em português, veja também esse:
http://www.guj.com.br/posts/list/52964.java#279083
E os dois da página seguinte. Geralmente, para jogos usamos thread direto, até pq, é interessante controlar a velocidade que o loop de desenho está ocorrendo e fazer o jogo rodar de maneira igual, independente da velocidade do computador.
Outros bons materiais sobre o assunto (em inglês):
http://www.cokeandcode.com/node/6
http://fivedots.coe.psu.ac.th/~ad/jg/ch1/index.html