Объект имеет нулевые значения, когда подкласс пытается использовать его. Почему?
Я новичок в 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 () существует, однако он выводит:
"в данный момент зарегистрирован как:"
2 ответа:
Код, который вы показали, выглядит нормально, поэтому проблема находится где-то в другом месте, или этот код не представляет того, что у вас есть. Кроме того, вы успешно обращаетесь к currentClient, если только вы не получаете NullPointerException или не ловите его где-то, то .вызов getUsername () разрешен. Так что проблема на самом деле в этом.getUsername(), то имя пользователя не инициализирован, когда вы звоните .getUsername ();
В качестве теста, вы можете позвонить .setUsername () на currentClient прямо перед вызовом .getUsername ()? Это должно помочь нам сузить проблему, изолировать ее либо до доступа к классу, либо до инициализируемой переменной.
Кроме того, вы знаете, как выполнять отладку с точками останова? Вы упомянули, что вы новичок, так что вы, возможно, не знаете, что это возможно. Если вы используете Eclipse( или другую хорошую IDE), вы можете установить точки останова и запустить программу в DEBUG build, тогда программа будет замерзать, когда она попадает в строку, на которой вы установили точку останова, и вы можете наблюдать, как программа движется строка за строкой, и смотрите переменные по мере их обновления программой. Google java debug tutorial. :)
Я согласен (не уверен, должен ли я добавить, поскольку кто-то уже ответил, что такое этикет?). Я запустил этот файл, и он показал мне панель с пользователем, вошедшим в систему как я, как установлено в конструкторе 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); } }