PDA

View Full Version : Problema evento in Java (novello)


xgab
03-08-2014, 21:00
salve a tutti!
sto facendo una full immersion di java, sono arrivato a gestire gli eventi con le interfacce grafiche ma ho un problemi che non capisco.
import java.awt.*;
import javax.swing.*;
import java.awt.event.*; //bisogna importare la classe
public class MyFrame extends JFrame implements ActionListener
{
JTextField prima; //le definisco nella classe in modo tale da essere visibili per tutti i metodi
JTextField seconda;
public MyFrame()
{
super("Inverti la tua Scritta!");

Container areaCentrale = getContentPane();
ascoltafinestra fin = new ascoltafinestra();
addWindowListener(fin); //non si definisce l'oggetto che esegue l'evento perchè è sottinteso riguardi la finestra

areaCentrale.setLayout(new FlowLayout());

JTextField prima = new JTextField(15); //creo una casella di testo che rende visibili 15 caratteri
JTextField seconda = new JTextField(15);
seconda.setEditable(false); //impostiamo la seconda casella come non modificabile

areaCentrale.add(prima);
areaCentrale.add(Box.createRigidArea(new Dimension(15,0)));
areaCentrale.add(seconda);



prima.addActionListener(this);//identifico l'evento derivante dalla casella prima di questa finestra

pack();//al posto del set size si può utilizzare questa funzione per impostare le dimensioni della finestra automaticamente in modo da rendere gli oggetti visibili
// si inserisce alla fine della definizione degli oggetti nella finestra

}

public void actionPerformed(ActionEvent e)
{
String iniziale = prima.getText(); //inserisco il testo nella stringa iniziale
String finale = capovolgi2(iniziale);
seconda.setText(finale);//la stringa capovolta la inserisco nella seconda casella
}

public String capovolgi(String iniziale)
{
String b = "";
for (int i= iniziale.length(); i==1 ; i--){

iniziale = iniziale.substring(i-1,i);

b = b + iniziale;
}
return b ;
}
public String capovolgi2(String iniziale){
String reverse = new StringBuffer(iniziale).reverse().toString();
return reverse;
}

}



mi presenta l'errore sulla stringa
String iniziale = prima.getText();
sicuramente è un errore nella dichiarazione dell'evento o simili.

Freaxxx
03-08-2014, 21:08
che errore ?

Sei sicuro di aver letto la documentazione per la classe e il metodo del caso ?

http://docs.oracle.com/javase/7/docs/api/javax/swing/text/JTextComponent.html#getText%28%29

Quando ponete un problema descrivetelo, che non abbiamo i poteri telecinetici per entrarvi nella testa, non ancora almeno .

xgab
03-08-2014, 21:31
si, scusami ho dimenticato un copia e incolla
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MyFrame.actionPerformed(MyFrame.java:37)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:508)
at javax.swing.JTextField.postActionEvent(JTextField.java:721)
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:836)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)


comunque riassumendo, il programma ha due caselle di testo, in una scrivo una stringa e nel momento in cui premo invio sull'altra casella avviene l'inversione dei caratteri ( da "ciao" a "oaic").
la console mi riporta l'errore sulla stringa 37, ovvero quella situata nel metodo actionPerformed che estrae la stringa dalla prima casella di testo.

Freaxxx
03-08-2014, 21:35
si, scusami ho dimenticato un copia e incolla
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MyFrame.actionPerformed(MyFrame.java:37)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:508)
at javax.swing.JTextField.postActionEvent(JTextField.java:721)
at javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:836)
at javax.swing.SwingUtilities.notifyAction(SwingUtilities.java:1663)
at javax.swing.JComponent.processKeyBinding(JComponent.java:2879)


comunque riassumendo, il programma ha due caselle di testo, in una scrivo una stringa e nel momento in cui premo invio sull'altra casella avviene l'inversione dei caratteri ( da "ciao" a "oaic").

leggi la documentazione, quella NullPointerException puzza di marcio .

non puoi usare getText() come una semplice funzione che ritorni un valore e fare una assegnazione del genere "sulla fiducia", leggi bene la documentazione.

wingman87
03-08-2014, 21:46
Semplicemente hai dichiarato la variabile "prima" come variabile d'istanza, per renderla visibile anche nel metodo actionPerformed ma poi, al momento di inizializzarla (nel costruttore MyFrame), l'hai ridichiarata creando quindi una variabile locale con lo stesso nome e che ovviamente al termine dell'esecuzione del costruttore perdi. La tua variabile d'istanza non ha quindi mai assunto il valore che ti aspettavi ed ha mantenuto il valore di default, cioè null.

xgab
03-08-2014, 21:53
public String getText()

Returns the text contained in this TextComponent. If the underlying document is null, will give a NullPointerException. Note that text is not a bound property, so no PropertyChangeEvent is fired when it changes. To listen for changes to the text, use DocumentListener.

Returns:
the text
Throws:
NullPointerException - if the document is null
sostanzialmente mi da quell'errore nel momento in cui la stringa è vuota, ma cercando su in giro, utilizzano tutti quel metodo in quel modo.
l'oggetto JTextField comunque restituisce una stringa, quindi i problemi di incompatibilità di variabile penso siano da scartare.

xgab
03-08-2014, 21:59
Semplicemente hai dichiarato la variabile "prima" come variabile d'istanza, per renderla visibile anche nel metodo actionPerformed ma poi, al momento di inizializzarla (nel costruttore MyFrame), l'hai ridichiarata creando quindi una variabile locale con lo stesso nome e che ovviamente al termine dell'esecuzione del costruttore perdi. La tua variabile d'istanza non ha quindi mai assunto il valore che ti aspettavi ed ha mantenuto il valore di default, cioè null.

hai ragione!
ma se non le dichiaro come variabili locali mi inizia a dare errori ovunque nel costrurre MyFrame perchè quelle due textbox le specifico nel layout :(

xgab
03-08-2014, 22:06
Risolto!
(mi scuso per il triplo messaggio)
le due variabili locali le ho dovute istanziare come oggetti per intero. Ora funziona! Grazie ragazzi!

Freaxxx
03-08-2014, 22:06
public String getText()

Returns the text contained in this TextComponent. If the underlying document is null, will give a NullPointerException. Note that text is not a bound property, so no PropertyChangeEvent is fired when it changes. To listen for changes to the text, use DocumentListener.

Returns:
the text
Throws:
NullPointerException - if the document is null
sostanzialmente mi da quell'errore nel momento in cui la stringa è vuota, ma cercando su in giro, utilizzano tutti quel metodo in quel modo.
l'oggetto JTextField comunque restituisce una stringa, quindi i problemi di incompatibilità di variabile penso siano da scartare.

aridaje, ti ho suggerito di leggere con attenzione.

la classe - o il tipo - JTextField restituisce una stringa se il campo del testo non è vuoto, in caso contrario genera una eccezione, non puoi usare quel metodo con un assegnazione del genere .

O usi quel genere di assegnazione in una porzione di codice dove sai a priori che nel 100% dei casi il campo testo sarà non nullo, o devi gestire l'eventualità di una eccezione generata da quel metodo, non hai molte alternative, e quello che fanno gli altri è spesso sbagliato e conta poco .