Объект имеет нулевые значения, когда подкласс пытается его использовать. Зачем?
Я новичок в 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, тогда программа остановится, когда достигнет строки, на которой вы установили точку останова, и вы сможете наблюдать, как программа перемещается по линии. и посмотрите, как переменные обновляются программой. Учебник по отладке Google Java.:)
Я согласен (не уверен, стоит ли мне добавлять, поскольку кто-то другой уже ответил, что такое этикет?). Я выполнил это нормально, и он показал мне панель с пользователем, вошедшим в систему как Me, как установлено в конструкторе 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);
}
}