Java обращаясь к переменным используя extends - PullRequest
2 голосов
/ 08 июня 2010

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

Фрагмент моего кода:

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

1 Ответ

4 голосов
/ 08 июня 2010

Поле 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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...