avevi proprio ragione, bastava un poco + di attenzione, ma dopo tante ore al PC ti si annebbia anche la vista. A proprosito di eventi, sempre studiando dal libro in questione ho implementato una struttura di controllo eventi su un bottone la quale mi permette di verificare se in una casella di testo sia stato inserito un numero intero:
codice:
/**
Crea un frame di ampiezza WIDTH ed altezza HEIGHT, acquisendo la risoluzione video
lo presenta a partire ad 1/4 delle sue coordinate.
*/
class tesiFrame extends JFrame{
//variabili posizione
private double x1aw[]=new double[100]; //casuali
private double y1aw[]=new double[100];
private int xaw[]=new int[100]; //convertite
private int yaw[]=new int[100];
private int kaw; //indice
/**
Costruttore
@param takap rappresenta la lunghezza dell'area di lavoro
@param habap rappresenta l'altezza dell'area di lavoro
@param Np rappresenta il numero di nodi
*/
public tesiFrame(int takap, int habap, int Np){
int Naw=Np;
int habaaw=habap;
int takaaw=takap;
[...]
Container contentPane = getContentPane(); //contenitori di pannelli
[...]
//pannello di ricerca
JPanel bPanel = new JPanel();
nawField = new IntTextField(20,3);
bPanel.add(nawField);
//nawField.getDocument().addDocumentListener(listener);
setButton = new JButton("Genera");
bPanel.add(setButton);
setButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
if (nawField.isValid())
panel.setNaw(nawField.getValue());
}//actionPerformed
});//ActionListener
contentPane.add(bPanel, BorderLayout.NORTH);
//pannello grafo
panel = new clumpPanel(takaaw, habaaw, Naw, xaw, yaw, x1aw, y1aw);
contentPane.add(panel, BorderLayout.CENTER);
//contentPane.add(panel);
}//tesiFrame
[...]
public static final int WIDTH = 500; //Ampiezza Frame
public static final int HEIGHT = 400; //Altezza Frame prima 350
private clumpPanel panel;
[...]
private IntTextField nawField;
private JButton setButton;
private PrintWriter out;
private BufferedReader in;
[...]
}//tesiFrame
la quale usa la classe IntTextField per gestire l'oggetto nawField. Tale classe si avvale di classi supplementari IntTextDocument e IntTextFieldVerifier, il tutto così implementato
codice:
/**
Un documento che piò contenere solo interi validi o loro
sottostringhe
*/
class IntTextDocument extends PlainDocument{
public void insertString(int offs, String str,
AttributeSet a)
throws BadLocationException{
if (str == null) return;
String oldString = getText(0, getLength());
String newString = oldString.substring(0, offs)+str+oldString.substring(offs);
if (canBecomeValid(newString))
super.insertString(offs, str, a);
}//insertString
/**
Una funzione di aiuto che controlla se la stringa è un
Intero valido
@param s una stringa
@return true se s è un intero valido
*/
public static boolean isValid(String s){
try{
Integer.parseInt(s);
return true;
}catch(NumberFormatException e){
return false;
}//catch
}//isValid
/**
Una funzione di aiuto che controlla se una stringa è una
Sottostringa di un intero valido
@param s una stringa
@return true se s piò essere esteso a un intero valido
*/
public static boolean canBecomeValid(String s){
return s.equals("") || s.equals("-") || s.equals("s");
}//canBecomeValid
}//IntTextDocument
/**
Un campo di testo per editare valori interi
*/
class IntTextField extends JTextField{
/**
Costruisce un IntTextField
@param defval il valore predefinito
@param size le dimensioni del campo
*/
public IntTextField(int defval, int size){
super(""+defval, size);
setInputVerifier(new IntTextFieldVerifier());
// Document doc = getDocument();
// doc.addUndoableEditListener(new UndoListener());
}//IntTextField
protected Document createDefaultModel(){
return new IntTextDocument();
}//createDefaultModel
/**
Controlla se il contenuto di questo campo è un intero valido.
@return true se il contenuto del campo è valido
*/
public boolean isValid(){
return IntTextDocument.isValid(getText());
}//isValid
/**
Prende il valore numerico del contenuto del campo.
@param il numero che l'utente ha scritto nel campo o
0 se il contenuto del campo non è valido
*/
public int getValue(){
try{
return Integer.parseInt(getText());
}catch(NumberFormatException e){
return 0;
}//catch
}//getValue
}//IntTextField
/**
Un verificatore che controlla se il contenuto di un componente
di testo è un intero valido.
*/
class IntTextFieldVerifier extends InputVerifier{
public boolean verify(JComponent component){
String text = ((JTextComponent)component).getText();
return IntTextDocument.isValid(text);
}//verify
}//IntTextFielverifier
alnalogamente al caso precedente, se l'utente dopo aver inserito un numero corretto nella casella di testo, clicca sul tasto 'Genera', dovrebbe essere visualizzato un nuovo grafico con i dati inseriti nella casella di testo:
codice:
/**
Un pannello che visualizza un grafo clump
*/
class clumpPanel extends JPanel{
private Color col1,col2,col3,col4; //colori
private double r; //raggio
private int k,l; //indici
private double Nd; //numero nodi casuali
private int Naw; //numero nodi
private int takaaw,habaaw; //lunghezza area grafo, altezza area grafo
private int kaw,iaw,jaw,i; //indici
//vettori posizione
private double x1aw[]=new double[100]; //casuali
double y1aw[]=new double[100];
private int xaw[]=new int[100]; //convertiti
private int yaw[]=new int[100];
/**
Costruttore
@param takap rappresenta la lunghezza dell'area di lavoro
@param habap rappresenta l'altezza dell'area di lavoro
@param Np rappresenta il numero di nodi
*/
public clumpPanel(int takap, int habap, int Np, int x[], int y[], double xc[], double yc[]){
[...]
}//clumpPanel
/**
restituisce la distanza tra la differeza di due punti
@param d1 rappresenta un valore di tipo double identicato come un punto
@param d2 rappresenta un valore di tipo double identicato come un punto
@param d2 rappresenta un valore di tipo double identicato come un punto
@param d3 rappresenta un valore di tipo double identicato come un punto
@param d4 rappresenta un valore di tipo double identicato come un punto
*/
public double d(double d1,double d2,double d3,double d4){
double dw;
//dw=jouaw(jouaw(d3-d1,2.0)+jouaw(d4-d2,2.0),0.5);
dw=Math.pow(Math.pow(d3-d1,2.0)+Math.pow(d4-d2,2.0),0.5);
//System.out.println("***DEBUG: d= "+dw);
return dw;
}//d
/**
Disegna il grafo
@param g di tipo Graphics rappresenta un oggetto atto a disegnare immagini e testi
*/
public void paintComponent(Graphics g){
super.paintComponents(g);
[...]
}//paintComponent
/**
Imposta il numero di nodi e la loro posizione;
@param n numero di nodi
*/
public void setNaw(int num){
Naw = num;
if(Naw==20){ //se il numero di nodi è 20 genera un numero di nodi casuali
Nd=4+46*Math.random();
Naw=(int)Nd;
}//if
for(kaw=0;kaw<Naw;kaw++){
//posiziona i nodi nel piano in modo casuale
x1aw[kaw]=Math.random()*(habaaw-30)+15;
y1aw[kaw]=Math.random()*(takaaw-30)+15;
xaw[kaw]=(int)x1aw[kaw];
yaw[kaw]=(int)y1aw[kaw];
}//for kaw
repaint();
}//setNaw
}//clumpPanel
ma ciò non avviene poichè non riesco più a scrivere nella casella di testo!!!