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. */packagecelulas;importjavax.swing.ImageIcon;importjavax.swing.JLabel;/** * * @author billy */publicclassPaneextendsJLabel{//metodo que recebe valores da classe Movstaticvoidsetl(intx,inty){setLocation(x,y);}publicPane(){ImageIconicon=newImageIcon("C:/Users/billy/Documents/NetBeansProjects/celulas/src/celulas/y.gif");setVisible(true);setBounds(0,0,31,25);setIcon(icon);RunnablerMov=(Runnable)newMov();ThreadtMov=newThread(rMov);tMov.start();}}
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagecelulas;importjava.awt.EventQueue;/** * * @author billy */publicclassMovimplementsRunnable{inty;intx;publicvoidrun(){EventQueue.invokeLater(newRunnable(){publicvoidrun(){x=10;y=10;for(;;){inti=1+(int)(Math.random()*8);System.out.println(""+i+"");if(i==1){if(y<=0){y=y+100;}y--;}elseif(i==2){if(y<=0){y=y+100;}if(x>=769){x=x-100;}x++;y--;}elseif(i==3){if(x>=769){x=x-100;}x++;}elseif(i==4){if(y>=575){y=y-100;}if(x>=769){x=x-100;}x++;y++;}elseif(i==5){if(y>=575){y=y-100;}y++;}elseif(i==6){if(y>=575){y=y-100;}if(x<=0){x=x+100;}x--;y++;}elseif(i==7){if(x<=0){x=x+100;}x--;}elseif(i==8){if(y<=0){y=y+100;}if(x<=0){x=x+100;}try{Thread.sleep(500);}catch(InterruptedExceptione){}x--;y--;}//envia dois numeros pra classe PanePane.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?
nakrak
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
PS valeu pela dica com os ifs
M
Marcos_Lima
Porquê o setl é estático?
Não parece lógico, e é isso que tá gerando o problema. Tente remover o modificaor static e veja se funciona.
nakrak
a classe Mov aparentemente so envia pra metodo static :?: :?: :?: :?: :?: :?: :?: :?:
aparece o mesmo erro so que na classe Mov
M
Marcos_Lima
Vc precisa passar a referência para o objeto do tipo Pane que você está querendo alterar, e não o nome da classe.
ai, no seu método lá embaixo, vc chama o set pro pane q vc recebeu no construtor:
// envia dois numeros pra classe Panepane.setl(x,y);
e o método da classe pane, vc tira o static
//metodo que recebe valores da classe Mov publicvoidsetl(intx,inty){setLocation(x,y);}
acho que isso resolve. testa ae.
A
alexfmjr
O seu problema está na hora de chamar o método setLocation(x,y)
ou o método setLocation deve ser static ou criar uma instancia de Pane antes de chamar o setLocation
Paneobj=newPane();obj.setLocation(x,y);
Um método static nunca chama um método não-static sem a criação do objeto antes.
Agora um método não-static pode chamar um método static sem problema nenhum.
nakrak
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);
M
Marcos_Lima
Mov estender Pane não é uma boa coisa… Tente aplicar o famoso teste… Mov “é um” Pane? Não, né…
O mario.fts explicou exatamente tudo o que você tem que fazer.
mario.fts
tipo, vc ta criando um label que fica mudando de lugar na tela, é isso?
nakrak
Exato mario
To testando o que vc disse antes
nakrak
fiz o que o Mario.fts disse e recebi o seguinte erro
Panepane;RunnablerMov=(Runnable)newMov(pane);
erro:
“Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException”
tentei assim tambem
RunnablerMov=(Runnable)newMov(this);
erro:
tela congelada
Eu estou utilizando thread pra fazer a mudanca de local em vez de um loop normal é que eu quero criar varios objetos JLabel que ficam andando na tela
ViniGodoy
Não quero parecer rude, mas quer uma dica?
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.
mario.fts
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:
tem mais alguns exemplos nos posts mais pra frente. da uma estudada nisso, é melhor que ficar trabalhando com threads diretamente
[]'s
nakrak
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.ThreadclockThread=newThread(newClockRunnable(),"Clock thread");clockThread.setDaemon(true);clockThread.start();