2010-06-08 4 views
2

Итак, у меня есть два класса: класс заказа клиента и класс подтверждения. Я хочу получить доступ к данным, хранящимся в LastNameTextField (класс заказа клиента), и установить его как текст для UserLastNameLabel (класс подтверждения) после нажатия кнопки «Отправить». По какой-то причине, однако, на выходе ничего не отображается.Доступ к переменным Java с использованием расширений

Отрывок из моего кода:

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; 
    }

ответ

4

Поле s будет иметь значение только в том случае метод getSubmitButton называется (это, кажется, не быть в вашем коде), кнопка возвращает добавляется в форму, и пользователь уже нажал на кнопку.

Когда вы звоните new confirmation(), вы получите новый объект с собственной поля s, и s в новом подтверждении иметь значение также будет необходимо иметь метод getSubmitButton называется, и слушатель действия срабатывает.

Я действительно не вижу причин для confirmation для продления customer_order в этом случае. Обычно вы расширяете класс для специализации - например, если у вас есть определенные заказы, которые обрабатывались по-разному, потому что они повторялись каждую неделю, вы можете создать новый класс repeating_customer_order, который добавляет дополнительные поля для работы с повторением. Доступ к данным из одного класса в другой на самом деле не является основанием для того, чтобы один из них расширил другой.

За то, что вы хотите сделать, я хотел бы предложить удаления Наследование (избавиться от extends customer_order), а затем передать значение s в конструктор:

customer_order:

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

подтверждения :

private final String s; 

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

Как и в сторону, ваш код было бы намного легче читать, если бы вы придерживались стандартных схем именования, используемых в большинстве приложений Java:

  • классы должны начинаться с прописной буквы и быть CamelCased, например. CustomerOrder вместо customer_order
  • поля должны начинаться с строчной буквы, например. lastNameTextField или submitButton

Это помогает людям сразу увидеть, что происходит дальше - на минуту быстрый взгляд на LastNameTextField.getText() делает его похожим вы вызываете статический метод в классе под названием LastNameTextField!

Смежные вопросы