eu tenho duas classes Pane e Mov
a classe Mov implements Runnable e é chamada pela classe Pane
a classe Mov deve retornar dois valores para um metodo da classe Pane e é ai que estou tendo o problema e nao to sabendo como resolver
seguem as classes Mov e Pane
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package celulas;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
/**
*
* @author billy
*/
public class Pane extends JLabel{
//metodo que recebe valores da classe Mov
static void setl(int x, int y) {
setLocation(x,y);
}
public Pane(){
ImageIcon icon = new ImageIcon("C:/Users/billy/Documents/NetBeansProjects/celulas/src/celulas/y.gif");
setVisible(true);
setBounds(0, 0, 31, 25);
setIcon(icon);
Runnable rMov = (Runnable) new Mov();
Thread tMov = new Thread(rMov);
tMov.start();
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package celulas;
import java.awt.EventQueue;
/**
*
* @author billy
*/
public class Mov implements Runnable {
int y;
int x;
public void run() {
EventQueue.invokeLater(new Runnable() {
public void run() {
x=10;
y=10;
for(;;){
int i = 1+(int)(Math.random() * 8);
System.out.println(""+i+"");
if(i==1){
if(y<=0){
y=y+100;
}
y--;
}else if(i==2){
if(y<=0){
y=y+100;
}
if(x>=769){
x=x-100;
}
x++;
y--;
}else if(i==3){
if(x>=769){
x=x-100;
}
x++;
}else if(i==4){
if(y>=575){
y=y-100;
}
if(x>=769){
x=x-100;
}
x++;
y++;
}else if(i==5){
if(y>=575){
y=y-100;
}
y++;
}else if(i==6){
if(y>=575){
y=y-100;
}
if(x<=0){
x=x+100;
}
x--;
y++;
}else if(i==7){
if(x<=0){
x=x+100;
}
x--;
}else if(i==8){
if(y<=0){
y=y+100;
}
if(x<=0){
x=x+100;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
x--;
y--;
}
//envia dois numeros pra classe Pane
Pane.setl(x, y);
}
}
});
}
}
cara, num consegui entender o que o código faz ainda, mas vai uma sugestão, troque esse monte de ifs por switch. melhor e muito a legibilidade do seu código.
int month = 8;
switch (month) {
case 1: System.out.println("January"); break;
case 2: System.out.println("February"); break;
case 3: System.out.println("March"); break;
case 4: System.out.println("April"); break;
case 5: System.out.println("May"); break;
case 6: System.out.println("June"); break;
case 7: System.out.println("July"); break;
case 8: System.out.println("August"); break;
case 9: System.out.println("September"); break;
case 10: System.out.println("October"); break;
case 11: System.out.println("November"); break;
case 12: System.out.println("December"); break;
default: System.out.println("Invalid month.");break;
}
}
O que vc quer fazer exatamente? qual o comportamentop q vc estava esperando? o que tem a ver com static?
linha 96 da classe Mov deve enviar os valores para a linha 20 da classe Pane mas aparece o erro
“C:\Users\billy\Documents\NetBeansProjects\celulas\src\celulas\Pane.java:20: non-static method setLocation(int,int) cannot be referenced from a static context”
e eu nao sei como resolver
valew Marcos
so que Pane é um objeto que cria a thread (mov) que deve enviar x e y que seriam a posicao de uma figura na tela entendeu?
entao eu fiz Mov extender de Pane e utilizei setl(x, y); entao acontece o seguinte erro
“Exception in thread “main” java.lang.StackOverflowError”
nao sei se alguem entendeu o que quero com esse codigo mas é simples
a classe Pane é um objeto JLabel que se utiliza da classe Mov para gerar suas coordenadas x e y na tela
Tudo o que eu preciso é que o objeto Pane receba setLocation(x, y);
Antes de entrar em assuntos avançados como multi-threading, procure aprender bem o Java básico.
Não entender como static e não static funcionam é beeeem trivial. Fora que o seu código está bem desorganizado, a começar por esses ifs gigantescos e essas contas místicas.
Outra coisa, se você está numa aplicação multi-threaded, usar static é pedir para ter problemas.
pq ao invés de fazer todo esse malabarismo, vc num usa um timer?
tem um exemplo aqui, q o vini postou hoje mesmo em outro lugar, ele usava pra exibir a hora em uma janela, e atualizava o valor a cada segundo. vc pode usar o mesmo principio, mas alterando a pocição do label:
tenho ciencia do que vcs dizem e ja tinha dado uma olhada no post da hora
vcs nao teriam um exemplo de uma thread multipla atualizando algum objeto?
Por favor? :oops: kkkk
Mas falando sobre o post do viny essa parte
// Iniciamos a thread do relógio. Tornei uma deamon thread para que seja
// automaticamente finalizada caso a aplicação feche.
Thread clockThread = new Thread(new ClockRunnable(), "Clock thread");
clockThread.setDaemon(true);
clockThread.start();