codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
/*************************************************************
* una Finestra e' il contenitore dei vari componenti grafici
*
*/
class Finestra extends JFrame
{
Finestra(int x0, int y0, int larghezza, int altezza)
{
// settaggio caratteristiche della finestra
setBounds(x0,y0,larghezza,altezza);
setTitle(getClass().getName());
setResizable(true);
setVisible(true);
// aggiunta di un ascoltatore per poter chiudere il frame
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.out.println("Fine dell'applicazione\n");
System.exit(0); // chiusura dell'applicazione
} // [m] windowClosing
}
);
} // [c] Finestra
} // [class] Finestra
/************************************************
* un Pannello e' un componente su cui disegnare
*
*/
class Pannello extends JPanel
{
//#### (strutture) dati che memorizzano il disegno ####
private int x_mouse, y_mouse; // ultimo clic del mouse
private int b_mouse; // ultimo bottone del mouse (16=sx, 4=dx)
private String s = ""; // stringa scritta sul pannello
private static Font f = new Font("Times New Roman",Font.ITALIC,80);
private Thread th;
//private int xg,yg;
private int[] x = new int [500];
private int[] y = new int [500];
//private int pos = 1;
//private int np = 1;
private boolean sinistra, destra, su, giu;
/**
* costruttore
*/
public Pannello(int x0, int y0, int lar, int alt)
{
// settaggi di configurazione
setBounds(x0,y0,lar,alt);
setBorder(new EtchedBorder());
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
//#### gestione degli eventi intercettati dal pannello ####
// il pannello viene reso sensibile ai clic del mouse
addMouseListener(new MouseAdapter()
{
//---- gestione del clic del mouse ----
public void mouseClicked(MouseEvent e)
{
x_mouse = e.getX();
y_mouse = e.getY();
//pos++;
//np++;
// cfr. InputEvent
b_mouse = e.getModifiers(); // bottone del mouse (16=sx,4=dx)
s = "";
repaint(); // richiama paint()
} // [m] mouseClicked
//---- gestione dell'entrata del mouse ----
public void mouseEntered(MouseEvent e)
{
setBackground(new Color(255,255,255));
s = "Per iniziare digita 'start'";
repaint(); // richiama paint()
} // [m] mouseEntered
//---- gestione dell'uscita del mouse ----
public void mouseExited(MouseEvent e)
{
setBackground(new Color(255,255,255));
repaint(); // richiama paint()
} // [m] mouseExited
}
);
// il pannello viene reso sensibile ai movimenti del mouse
addMouseMotionListener(new MouseMotionAdapter()
{
//---- gestione del movimento del mouse ----
public void mouseMoved(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
//xg = x;
//yg = y;
repaint(); // richiama paint()
} // [m] mouseMoved
}
);
addKeyListener(new KeyAdapter() // da verificare perchè non vanno le frecce direzionali...
{
@Override
public void keyPressed(KeyEvent q)
{
if (q.getKeyCode() == KeyEvent.VK_LEFT)
{
if ((su || giu))
{
sinistra = true;
destra = giu = su = false;
x_mouse--;
}
}
else if (q.getKeyCode() == KeyEvent.VK_RIGHT)
{
if (su || giu)
{
destra = true;
sinistra = giu = su = false;
x_mouse++;
}
}
else if (q.getKeyCode() == KeyEvent.VK_UP)
{
if (destra || sinistra)
{
su = true;
giu = destra = sinistra = false;
y_mouse++;
}
}
else if (q.getKeyCode() == KeyEvent.VK_DOWN)
{
if (destra || sinistra)
{
giu = true;
su = destra = sinistra = false;
y_mouse--;
}
}
}
});
} // [c] Pannello
/**
* esecuzione di un comando
*/
public void esegui(String cmd)
{
System.out.println("Comando da eseguire = ["+cmd+"]"); // DA FINIRE
if (cmd.equals("start"))
attiva();
} // [m] esegui
/**
* ridisegno della parte grafica
* (questo metodo viene richiamato automaticamente quando la finestra
* deve essere ridisegnata (ad esempio quando viene sovrapposta
* da un'altra)
*/
public void paint(Graphics g)
{
super.paint(g);
g.setColor(Color.blue);
//for(int i=0;i<=pos;i++)
g.fillOval(x_mouse+150,y_mouse+150,10,10); // piccolo cerchio pieno
//g.fillOval(x_mouse+145,y_mouse+145,10,10);
//g.fillOval(x_mouse+140,y_mouse+140,10,10);
//g.setColor(Color.red);
//g.drawLine(10,10,400,500);
g.setColor(Color.red);
g.drawString(s,100,200);
} // [m] paint
//#### begin thread ####
/**
* - creazione del thread (new Thread())
* - definizione del comportamento del thread (def. del metodo run())
* - attivazione del thread (th.start())
*/
public void attiva()
{
th = new Thread()
{
// ridefinizione del metodo run
public void run()
{
for (;;) // ciclo infinito
{
s = "";
//x_mouse++; // così all'inizio resta fermo...
//y_mouse++;
repaint();
try {
sleep(50);
}
catch (InterruptedException e)
{
System.out.println("thread interrotto");
return;
}
} // for
}
};
th.start();
} // [m] attiva
//#### end thread ####
} // [class] Pannello
/*********************************************************************
* un Campo e' una finestra testo sulla quale si puo' scrivere
*
*/
class Campo extends JTextField
{
private static String stringaletta = "";
/**
* costruttore
* Parametri:
* lar,alt : larghezza ed altezza
*/
Campo(int x0, int y0, int lar, int alt)
{
setBounds(x0,y0,lar,alt);
setFont(new Font("Monospaced",Font.PLAIN,11));
setEditable(true); // attiva il cursore
setVisible(true); // rende visibile
// intercettamento dell'evento "tasto INVIO"
addActionListener
(new ActionListener()
{
// quando si batte INVIO stringaletta prende il testo
public void actionPerformed(ActionEvent e)
{
stringaletta = "";
stringaletta = getText();
setText(""); // serve?
}
}
);
} // [c] Campo
/**
* lettura di una stringa
* msg rappresenta la stringa iniziale proposta
*
*/
public String leggiStringa(String msg)
{
stringaletta = "";
requestFocus(); // non attiva comunque il cursore
setEditable(true);
setText(msg); // messaggio guida dell'input
setCaretPosition(msg.length()); // 0 e' all'inizio
while (stringaletta.equals(""))
;
String rets = stringaletta;
stringaletta = "";
setEditable(false);
return rets;
} // [m] leggiStringa
/**
* lettura di una stringa
*
*/
public String leggiStringa()
{
return leggiStringa("");
} // [m] leggiStringa
/**
* scrittura di una stringa sul campo testo (come messaggio)
*
*/
public void scriviStringa(String s)
{
setText(s);
} // [m] scriviStringa
} // [class] Campo
class Progetto
{
public static void main(String[] args)
{
// creazione finestra e componenti
Finestra f = new Finestra(10,20,400,550); // contenitore top-level
Pannello p = new Pannello(50,50,300,380); // pannello su cui disegnare
Campo c = new Campo(50,450,300,20); // campo comandi
// settaggio colore dei componenti
f.setBackground(new Color(200,100,100));
f.setTitle("XSnake - versione 1.0");
p.setBackground(new Color(230,210,190));
p.setFocusable(true); // dovrebbe rendere sensibile la pressione sulle freccie direzionali ma...?
c.setBackground(new Color(210,230,250));
// assemblaggio del sistema grafico: Finestra+Pannello+Campo
f.setLayout(null); // altrimenti il pannello invade tutta la finestra
f.add(p); // attacco del pannello alla finestra
f.add(c); // attacco del campo alla finestra
// attivazione del thread associato al pannello
//p.attiva();
// visualizzazione
f.setVisible(true);
p.repaint();
p.setFocusable(true);
// gestione comandi scritti sul campo testo
String s;
do {
s = c.leggiStringa("");
p.esegui(s);
} while (!s.equals("fine"));
} // [m] main
} // [class] Progetto
Ho provato anche ad aggiungere il comando "p.setFocusable(true);" ma niente da fare...