|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
[Java] Problema interfaccia Runnable
Sto provando a implementare questa interfaccia per fare in modo che un pallino disegnato su un Jpanel si sposti di 10 pixel alla volta ogni secondo. Solo che non va una ceppa e non capisco perchè!! Se avete dei tutorial da linkarmi sull'argomento ve ne sarei grato, intanto vi posto il codice che ho scritto
Codice:
package animation;
import java.awt.*;
import javax.swing.*;
public class Animazione extends JFrame{
public static void main(String [] args){
JFrame x=new JFrame();
x.setSize(400, 400);
x.setResizable(true);
x.setDefaultCloseOperation(EXIT_ON_CLOSE);
x.setContentPane(new Panel());
Runner r=new Runner(new Panel());
new Thread(r).start();
x.setVisible(true);
}
}
public class Panel extends JPanel{
int x,y=100;
protected void paintComponent(Graphics g){
g.setColor(Color.GREEN);
g.fillOval(x, y, 30, 30);
}
}
public class Runner implements Runnable{
Panel p;
public Runner(Panel p){
this.p=p;
}
public void run() {
while(true){
try{
Thread.sleep(1000);
p.x+=10;
} catch (Exception e){e.printStackTrace();}
p.repaint();
}
}
}
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
immagino che non ti funzioni bene: hai un thread esterno all'EDT che accede in scrittura al tuo Panel per modificare i valori dei campi 'x' e 'y' e poi richiedere un aggiornamento della grafica ogni secondo circa, e hai il thread EDT che accede in lettura a quegli stessi valori ogni volta che viene invocato il metodo paintComponent.
Problemi: 1) hai due thread che accedono in modo non sincronizzato agli stessi campi: data-race! (devi sincronizzare l'accesso ai dati). 2) hai un thread che manipola un componente Swing visualizzabile e questo thread non è l'EDT: infrazione dell'architettura a thread singolo di Swing.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
arabo
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Sì e poi non mi sono accorto di una cosa molto più importante, qui:
Codice:
public static void main(String [] args){
JFrame x=new JFrame();
x.setSize(400, 400);
x.setResizable(true);
x.setDefaultCloseOperation(EXIT_ON_CLOSE);
x.setContentPane(new Panel());
Runner r=new Runner(new Panel());
new Thread(r).start();
x.setVisible(true);
}
Questo codice si avicina alla soluzione, le modifiche sono quelle in grassetto: Codice: Codice:
public class Animazione extends JFrame
{
public static void main(String [] args)
{
JFrame x=new JFrame();
x.setSize(400, 400);
x.setResizable(true);
x.setDefaultCloseOperation(EXIT_ON_CLOSE);
Panel myPanel = new Panel();
x.setContentPane(myPanel);
x.setVisible(true);
Runner r=new Runner(myPanel);
new Thread(r).start();
}
}
class Panel extends JPanel
{
int x,y=100;
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillOval(x, y, 30, 30);
}
}
class Runner implements Runnable
{
Panel p;
public Runner(Panel p)
{
this.p=p;
}
public void run()
{
while(true)
{
try
{
Thread.sleep(1000);
p.x+=10;
} catch (Exception e){e.printStackTrace();}
p.repaint();
}
}
}
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 20-07-2009 alle 12:41. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
uppo perchè mi sono evoluto
ho scritto sto programma con 4 bottoni: -Start fa partire l'animazione della pallina -Stop la fa fermare -Reset resetta il programma -Color cambia il colore dello sfondo in maniera casuale Sono riuscito a far partire l'animazione all'inizio. Solo non capisco come fare per interromperla e farla partire a comando. Codice:
package game;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;
public class Gioco extends JFrame{
public Gioco(){
try{jbinit();} catch(Exception e){e.printStackTrace();}
}
private void jbinit(){
JFrame x=new JFrame("Gioco");
x.setSize(new Dimension(400,300));
x.setResizable(true);
x.setDefaultCloseOperation(EXIT_ON_CLOSE);
MyPanel myPane=new MyPanel();
x.setContentPane(myPane);
new Thread(myPane).start();
x.setVisible(true);
}
public static void main(String [] args){
Gioco gioco=new Gioco();
}
}
public class Pane extends JPanel {
public int x=192; int y=142;
protected void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillOval(x, y, 16, 16);
}
}
public class MyPanel extends JPanel implements Runnable{
JButton start,stop,reset,color;
JFormattedTextField tfield;
Pane pane;
Random generatore=new Random(System.currentTimeMillis()/11);
private void createAndShowGUI(){
setLayout(new GridBagLayout());
GridBagConstraints c=new GridBagConstraints();
start=new JButton("Start");
c.fill=GridBagConstraints.HORIZONTAL;
start.addActionListener(new Start());
c.weighty=0;
c.gridx=0;
c.gridy=0;
add(start,c);
stop=new JButton("Stop");
c.gridx=1;
c.gridy=0;
add(stop,c);
reset=new JButton("Reset");
c.gridx=2;
c.gridy=0;
add(reset,c);
color=new JButton("Color");
color.addActionListener(new ChangeColor());
c.gridx=3;
c.gridy=0;
add(color,c);
tfield=new JFormattedTextField("10");
c.gridx=4;
c.gridy=0;
add(tfield,c);
pane=new Pane();
pane.addKeyListener(new Sposta());
pane.addMouseListener(new GetFocus());
c.fill=GridBagConstraints.BOTH;
c.weightx=1;
c.weighty=1;
c.gridx=0;
c.gridy=1;
c.gridwidth=5;
add(pane,c);
}
public MyPanel(){
try{createAndShowGUI();}
catch (Exception e){e.printStackTrace();}
}
public void run() {
while(true){
try{
Thread.sleep(1000);
pane.x+=10;
} catch (Exception e){e.printStackTrace();}
pane.repaint();
}
}
class ChangeColor implements ActionListener{
int green,red,blue;
public void actionPerformed(ActionEvent e) {
red=generatore.nextInt(255)+1;
green=generatore.nextInt(255)+1;
blue=generatore.nextInt(255)+1;
pane.setBackground(new Color(red,green,blue));
}
}
class Sposta implements KeyListener{
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
int choice=e.getKeyCode();
int move=Integer.parseInt(tfield.getText());
switch(choice){
case KeyEvent.VK_UP:pane.y-=move; pane.repaint();break;
case KeyEvent.VK_DOWN:pane.y+=move; pane.repaint();break;
case KeyEvent.VK_LEFT:pane.x-=move; pane.repaint();break;
case KeyEvent.VK_RIGHT:pane.x+=move; pane.repaint();break;
}
}
public void keyReleased(KeyEvent e) {}
}
class GetFocus implements MouseListener{
public void mouseClicked(MouseEvent e) {
pane.requestFocusInWindow();
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
class Start implements ActionListener{
public void actionPerformed(ActionEvent e) {
}
}
}
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
up
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:43.




















