2010-06-08 7 views
2

J'ai donc deux classes: Classe de commande client et Classe de confirmation. Je veux accéder aux données stockées dans LastNameTextField (classe de commande client) et le définir comme le texte pour UserLastNameLabel (classe de confirmation) après avoir cliqué sur un bouton "Envoyer". Pour une raison quelconque cependant, la sortie n'affiche rien.Java accédant à des variables en utilisant

Snippet de mon code:

package customer_order; 

public class customer_order extends Frame{ 
    private static final long serialVersionUID = 1L; 
    private JPanel jPanel = null; 
    private JLabel LastNameLabel = null; 
    protected JTextField LastNameTextField = null; 
    private JButton SubmitButton = null; 
    public String s; 

    public customer_order() { 
     super(); 
     initialize(); 
    } 

    private void initialize() { 
     this.setSize(729, 400); 
     this.setTitle("Customer Order"); 

     this.add(getJPanel(), BorderLayout.CENTER); 
    } 

    /** 
    * This method initializes LastNameTextField  
    * 
    * @return javax.swing.JTextField 
    */ 
    public JTextField getLastNameTextField() { 
     if (LastNameTextField == null) { 
      LastNameTextField = new JTextField(); 
      LastNameTextField.setBounds(new Rectangle(120, 100, 164, 28)); 
      LastNameTextField.setName("LastNameTextField"); 
       } 

     return LastNameTextField; 
    } 
    /** 
    * This method initializes SubmitButton 
    * 
    * @return javax.swing.JButton 
    */ 
    private JButton getSubmitButton() { 
     if (SubmitButton == null) { 
      SubmitButton = new JButton(); 
      SubmitButton.setBounds(new Rectangle(501, 225, 96, 29)); 
      SubmitButton.setName("SubmitButton"); 
      SubmitButton.setText("Submit"); 
      SubmitButton.addActionListener(new java.awt.event.ActionListener() { 
       public void actionPerformed(java.awt.event.ActionEvent e) { 
        System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed() 
        //THE STRING I WANT 
      s = LastNameTextField.getText(); 
        java.awt.EventQueue.invokeLater(new Runnable() { 
         public void run() { 
          new confirmation().setVisible(true); 

         } 
        }); 
       } 
      });  
     } 
     return SubmitButton; 
    }
package customer_order; 

public class confirmation extends customer_order{ 
    private static final long serialVersionUID = 1L; 
    private JPanel jPanel = null; // @jve:decl-index=0:visual-constraint="58,9" 
    private JLabel LastNameLabel = null; 
    private JLabel UserLastNameLabel = null; 


    // @jve:decl-index=0: 
    /** 
    * This method initializes frame  
    * 
    * @return java.awt.Frame 
    */ 
    public confirmation() { 
     super(); 
     initialize(); 
    } 

    private void initialize() { 
     this.setSize(729, 400); 
     this.setTitle("Confirmation"); 

     this.add(getJPanel(), BorderLayout.CENTER); 
    } 
    /** 
    * This method initializes jPanel 
    * 
    * @return javax.swing.JPanel 
    */ 
    private JPanel getJPanel() { 
     if (jPanel == null) { 
      UserLastNameLabel = new JLabel(); 
      UserLastNameLabel.setBounds(new Rectangle(121, 60, 167, 26)); 
      //THE PROBLEM? 
      UserLastNameLabel.setText(s); 

     } 
     return jPanel; 
    }

Répondre

4

Le champ s n'aura une valeur si la méthode est appelée getSubmitButton (il ne semble pas être dans votre code), le bouton retourne est ajouté au formulaire et l'utilisateur a déjà cliqué sur le bouton.

Lorsque vous appelez new confirmation(), vous obtenez un nouvel objet avec son propre champ s, et pour s dans la nouvelle confirmation d'avoir une valeur, il devra également avoir la méthode getSubmitButton appelé, et l'auditeur d'action déclenché.

Je ne vois vraiment aucune raison pour confirmation d'étendre customer_order dans ce cas. Normalement, vous étendez une classe pour la spécialiser - par exemple, si vous aviez certaines commandes qui ont été traitées différemment parce qu'elles se répètent chaque semaine, vous pouvez créer une nouvelle classe repeating_customer_order qui ajoute des champs supplémentaires pour gérer la répétition. Accéder à des données d'une classe dans une autre n'est pas vraiment une raison pour faire se prolonger l'autre.

Pour ce que vous voulez faire, je vous suggère de retirer le inheritence (se débarrasser de extends customer_order), et en faisant passer la valeur de s dans le constructeur:

Commande_Client:

  s = LastNameTextField.getText(); 
        java.awt.EventQueue.invokeLater(new Runnable() { 
         public void run() { 
          new confirmation(s).setVisible(true); 
         } 
        });

confirmation :

private final String s; 

    public confirmation(final String s) { 
     super(); 
     this.s = s; 
     initialize(); 
    }

En aparté, votre code serait beaucoup plus facile à lire si vous avez gardé les schémas de nommage standard utilisés dans la plupart des applications Java:

  • cours devraient commencer par une lettre majuscule et être notationCamel, par exemple CustomerOrder au lieu de customer_order
  • Les champs doivent commencer par une lettre minuscule, par ex. lastNameTextField ou submitButton

Cela aide les gens à voir en un coup d'oeil ce qui se passe - à la minute un rapide coup d'œil à LastNameTextField.getText() fait ressembler à vous appelez une méthode statique dans une classe appelée LastNameTextField!

Questions connexes