2010-06-08 53 views
2

所以在这里我有两个类:Customer Order Class和Confirmation Class。我想访问存储在LastNameTextField(Customer Order Class)中的数据,并在单击“Submit”按钮后将其设置为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

如果getSubmitButton方法被调用s场只会有一个值(它似乎并没有在你的代码),按钮返回被添加到表单中,并且用户已经点击了该按钮。

当你调用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或提交按钮

这有助于让人一目了然是怎么回事看到 - 在一分钟在LastNameTextField.getText()看一眼使它看起来像你调用一个名为LastNameTextField类的静态方法!