Java使用extends访问变量

标签 java global-variables scope

所以这里我有两个类:客户订单类和确认类。我想访问存储在 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;
    }

最佳答案

s仅当 getSubmitButton 时,字段才会有值。方法被调用(它似乎不在您的代码中),它返回的按钮被添加到表单中,并且用户已经单击了该按钮。

当您调用new confirmation()时,您将获得一个对象及其自己的字段 s ,以及 s在新的确认中有一个值,它还需要有 getSubmitButton调用方法,并触发操作监听器。

我实在看不出 confirmation 有任何理由延长customer_order在这种情况下。通常,您会扩展一个类(class)来专门化 - 例如,如果您有某些订单,因为它们每周重复,所以会受到不同的对待,您可以创建一个新类(class) repeating_customer_order它添加了额外的字段来处理重复。从一个类访问另一个类的数据并不是让一个类扩展另一个类的真正理由。

对于你想做的事情,我建议删除继承(摆脱 extends customer_order ),然后传递 s 的值进入构造函数:

客户订单:

          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 应用程序中使用的标准命名方案,您的代码会更容易阅读:

  • 类应以大写字母开头并采用驼峰式命名,例如CustomerOrder 而不是 customer_order
  • 字段应以小写字母开头,例如lastNameTextField 或submitButton

这可以帮助人们一目了然地了解正在发生的事情 - 立即快速浏览 LastNameTextField.getText()看起来就像您在名为 LastNameTextField 的类中调用静态方法!

关于Java使用extends访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2994415/

相关文章:

python - 在基于 Flask 的 Python Web 应用程序中从外部更改全局变量

java - ListView setAdapter 对空对象引用

java - 安卓。 Countdownlatch.await 不起作用

java - 进度条未在通知中更新

javascript - 在 jquery.live() 中声明可在所有函数中使用的 var

java - 为什么数组值没有在 switch case 中保留?

Coffeescript 类和范围以及粗细箭头

java - 如何限制子类修改抽象类中方法的范围?

ruby-on-rails-3 - 使用 except 的范围不起作用 Rails

java - 在没有 Java-Bridge 的情况下编译 Jasper Report remoteley