2012-05-01 16 views
2

我是一个新手Java人,所以我可能做这件事完全错误。我必须做这个软件工程类的巨大项目。该代码是约2000线长,所以这是骨架代码当子类尝试使用它时,对象具有空值。为什么?

public class BookRental extends JFrame{ 
    public Client currentClient = new Client(); // creating client object 
    //rest of declared variables. 

    public class Client{      //Client class containing all get/set methods for each variable 
    private username; 
    private void setUsername(String u){ 
     username = u; 
    } 
    public String getUsername(){ 
     return username; 
    } 


    public class LoginPanel extends JPanel{} //Panel to show and receive login info. 
    public class RegisterPanel extends JPanel{} //Panel to register. 
    public class MenuPanel extends JPanel{  //Panel showing main menu. 
     //At this point currentClient will contain values 
     public ClientInfoPanel(){ 
     initComponents(); 
     } 
     private void initComponents(){ 
     infoPanelUserName = new JLabel(); 
     infoPanelFullName.setText("Currently logged in as: " + currentClient.getUsername()); 
     } 
     private JLabel infoPanelUserName; 
    } 
    public class ClientInfoPanel extends JPanel{} //Panel to print currentClient info to screen using JLabel objects 

    private void ViewClientInfoButtonActionPerformed(event){ // Using button in Menu Panel to setVisibility of clientInfoPanel to (true) 
     //At this point there will be a value for currentClient 
     clientInfoPanel = new ClientInfoPanel(); 
     this.add(clientInfoPanel); 
     menuPanel.setVisible(false); 
     clientInfoPanel.setVisible(true); 
    } 
    public BookRental(){initComponents();} //Constructor 
    private void initComponents(){}    // Creates all panels and sets visibility off, besides login 

    public static void main(String args[]){ 
     new BookRental().setVisible(true); 
    } 

}

我已经敢肯定,我这样做完全错误的,但我的问题是,为什么我不能访问currentClient ClientInfoPanel内?说这个的JLabel:

infoPanelUserName.setText("Currently logged in as: " + currentClient.getUsername()); 

的ClientInfoPanel承认currentClient存在并且getUsername()方法存在,但它打印:

“目前登录为:”

+1

请出示你在谈论(“当我调用get方法currentClient里面的代码ClientInfoPanel,它识别变量,但它不包含正确的值“)。 –

+6

所以你是一个初学者,你一次写了2000行代码,然后你试图运行它,它根本不起作用,现在它太复杂了,你无法进行调试。嗯......也许问题不在于你的代码,而在于你写这些代码的方式。即使您修复此错误,也可能有100个其他错误。 –

+0

我是指infoPanelFullName.setText(“Full Name:”+ currentClient.getFullname());它认识到currentClient和方法getFullname()存在。然而,JLabel只显示“Full Name:”并且调试显示getFullname()返回“”这是默认的构造函数... – SeanMG

回答

0

的你显示的代码看起来很好,所以问题在别的地方,或者这个代码并不代表你拥有的东西。此外,您正在成功访问currentClient,除非您得到NullPointerException或在某处捕获它,那么.getUsername()调用将会解析。因此,问题实际上是使用.getUsername(),当您调用.getUsername()时,不知何故,用户名未初始化。

作为一个测试,你可以在调用.getUsername()之前调用currentClient上的.setUsername()?这应该有助于我们缩小问题范围,将其隔离为类访问或正在初始化的变量。

另外,你知道如何调试断点吗?你提到你是新的,所以你可能不知道这是可能的。如果您使用的是Eclipse(或另一个良好的IDE),则可以设置断点并在DEBUG构建中运行该程序,然后当程序到达您设置断点的那一行时,程序将冻结,并且您可以观察程序是否按照行,并看到它们由程序更新的变量。 Google java调试教程。 :)

0

我同意(不确定是否应该添加,因为别人已经回答,礼节是什么?)。我跑这很好,这表明我的小组与用户登录和我一样在BookRental构造方法设置:

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class BookRental extends JFrame{ 
    public Client currentClient = new Client(); // creating client object 
    //rest of declared variables. 

    public class Client{      //Client class containing all get/set methods for each variable 
    private String username; 
    private void setUsername(String u){ 
     username = u; 
    } 
    public String getUsername(){ 
     return username; 
    } 
    } 


    public class ClientInfoPanel extends JPanel{  //Panel showing main menu. 
     //At this point currentClient will contain values 
     public ClientInfoPanel(){ 
     initComponents(); 
     } 
     private void initComponents(){ 
     infoPanelUserName = new JLabel(); 
     infoPanelUserName.setText("Currently logged in as: " + currentClient.getUsername()); 
     this.add(infoPanelUserName); 
     } 
     private JLabel infoPanelUserName; 
    } 
    public ClientInfoPanel clientInfoPanel; 


    //Constructor 
    public BookRental(){ 
     currentClient.setUsername("Me"); 
     initComponents(); 
    } 
    private void initComponents(){ 
     clientInfoPanel = new ClientInfoPanel(); 
      this.add(clientInfoPanel); 
      clientInfoPanel.setVisible(true); 
    } 

    public static void main(String args[]){ 

     new BookRental().setVisible(true); 
    } 
} 
+0

是的,变量获取一个值,但是当您调用JLabel时,它不能显示值。 Marko Topolnik的回答让我相信我创建的类是嵌套的,并且值是坐在内部类无法访问的外部类中。 – SeanMG

相关问题