2017-10-03 11 views
0

Je rencontre des problèmes lors du stockage d'une valeur en utilisant un ActionListener avec un JButton. Je suis assez nouveau à Java et pas 100% confiant dans la classe et la manière de sous-classe de programmation.Impossible de résoudre le champ en Java lors du stockage des valeurs à partir de JTextField

import java.ActionEvent; 
import javaActionListener; 
import javax.swing JButton; 
import javax.swing JPanel; 
import javax.swing.JTextField; 

public class Trial extends JPanel implements Action Listener { 

    private static final long serialVersionUID = 1L; 

    public Trial() { 
     setFrame(); 
    } 

    public void setFrame(){ 

     JFrame frame = new JFrame("Trial"); 
     JPanel panel = new JPanel(); 
     JTextField field = new JTextField(10); 
     JButton button = new JButton("Enter"); 
     button.addActionListener(this); 

     panel.add(field); 
     panel.add(button); 

     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Trial(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     String s = field.getText(); 
     System.out.prinln("Button is pressed"); 
    } 
} 
champ

est pas défini à l'intérieur actionPerformed, pourquoi il en est ainsi? J'ai joué avec l'ActionEvent, et il semble que je ne puisse pas passer de variable en dehors de la fonction actionPerformed. Alors, comment vais-je faire cela? Dois-je déplacer setFrame() vers sa propre classe?

+0

Pourquoi 'Trial' étend-il' JPanel'? Cela semble complètement inutile pour cela. –

+0

le code est juste un extrait du code original. Je viens de prendre les lignes de code nécessaires pour la question. –

Répondre

0

La raison de votre problème est liée à la portée du champ de variable. En java, la portée d'une variable est définie par le bloc de code dans lequel elle est définie. Votre champ JTextField est déclaré dans la méthode setFrame, cela signifie que la variable n'est visible que dans la méthode setFrame.

Si vous voulez rendre la variable de champ visible dans toute la classe afin de pouvoir y accéder dans votre méthode actionPerformed, vous pouvez en faire une variable d'instance.

public class Trial extends JPanel implements Action Listener { 

    private static final long serialVersionUID = 1L; 
    private JTextField field; //Move your declaration to class level, making it an instance variable. 

    public Trial() { 
     setFrame(); 
    } 

    public void setFrame(){ 

     JFrame frame = new JFrame("Trial"); 
     JPanel panel = new JPanel(); 
     field = new JTextField(10); //Remove the declaration of the variable and just initialize it here. 
     JButton button = new JButton("Enter"); 
     button.addActionListener(this); 

     panel.add(field); 
     panel.add(button); 

     frame.add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Trial(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     String s = field.getText(); //Now you can access field within any method in the class. 
     System.out.prinln("Button is pressed"); 
    } 
} 

Espérons que le code ci-dessus l'explique assez, toutes les questions s'il vous plaît commenter et je vais élaborer.

0

Votre méthode setFrame() crée et initialise le champ, mais une autre méthode n'a pas le moyen d'accéder à cet objet avec ses propriétés spécifiques.

Essayez ceci:

public class Trial extends JPanel implements Action Listener { 

    JTextField field; 

    ..// omitted 

    public void setFrame() 
    { 
     JFrame frame = new JFrame("Trial"); 
     JPanel panel = new JPanel(); 
     field = new JTextField(10); 

    .. //omitted 

Lorsque ayant déclaré l'objet -certain- en dehors de toute méthode, cela signifierait une méthode pourrait accéder à cet objet -certain- et modifier (ou récupérer) propriétés/méthodes de.