-4

주소록을 만들고 모든 코드가 완료되었지만 계속 오류가 발생합니다! 나는 오류가 나타나고 빈 프레임, 프레임이 내용을 읽고되지 주소록을 실행하면GUI - 실행 중 Java 오류

Exception in thread "main" java.lang.NullPointerException 
at java.awt.Container.addImpl(Unknown Source) 
at java.awt.Container.add(Unknown Source) 
at javax.swing.JFrame.addImpl(Unknown Source) 
at java.awt.Container.add(Unknown Source) 
at MyAddressBook.<init>(MyAddressBook.java:40) 
at MyAddressBook.main(MyAddressBook.java:31) 

이 코드를 실행하십시오 그리고 당신은 내가 무슨 말을하고 무엇을 볼 것이다 : 이것은 오류입니다. 이 문제를 어떻게 해결할 수 있을지 제안 해주십시오.

내 코드 :

import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import java.awt.event.*; import java.awt.*; import java.io.*; public class AddressBook { 

private JLabel lblFirstname,lblSurname, lblMiddlename, lblPhone, 
lblEmail,lblAddressOne, lblAddressTwo, lblCity, lblPostCode, lblPicture; 
private JTextField txtFirstName, txtSurname, txtAddressOne, txtPhone, 
txtMiddlename, txtAddressTwo, txtEmail, txtCity, txtPostCode; 
private JButton btSave, btExit, btDelete; 
private JList<String> list; 
private DefaultListModel<String> listModel; 
private JPanel panel; 
PrintWriter out; 

public static void main(String[] args) throws Exception{ 
    new AddressBook(); 
} 

public AddressBook() throws Exception{ 
    JFrame frame = new JFrame("My Address Book"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(900,400); 
    frame.setVisible(true); 
    out = new PrintWriter (new BufferedWriter (new FileWriter("outfile.txt",true))); 
    frame.add(panel); 
    frame.setVisible(true); 
} 
public void MyPanel() { 
    panel = new JPanel(); 
    panel.setLayout(null); 
    panel.setBackground(Color.cyan); 

} 
public void Fields() { 
    lblFirstname = new JLabel("First name"); 
    lblFirstname.setBounds(135, 50, 150, 20); 
    Font styleOne = new Font("Arial", Font.BOLD, 13); 
    lblFirstname.setFont(styleOne); 
    panel.add(lblFirstname); 
    txtFirstName = new JTextField(); 
    txtFirstName.setBounds(210, 50, 150, 20); 
    panel.add(txtFirstName); 

    lblSurname = new JLabel ("Surname"); 
    lblSurname.setBounds(385,50,150,20); 
    Font styleTwo = new Font ("Arial",Font.BOLD,13); 
    lblSurname.setFont(styleTwo); 
    panel.add(lblSurname); 
    txtSurname = new JTextField(); 
    txtSurname.setBounds(450,50,150,20); 
    panel.add(txtSurname); 

    lblMiddlename = new JLabel ("Middle Name"); 
    lblMiddlename.setBounds(620,50,150,20); 
    Font styleThree = new Font ("Arial", Font.BOLD,13); 
    lblMiddlename.setFont(styleThree); 
    panel.add(lblMiddlename); 
    txtMiddlename = new JTextField(); 
    txtMiddlename.setBounds(710,50,150,20); 
    panel.add(txtMiddlename); 

    lblPhone = new JLabel("Phone"); 
    lblPhone.setBounds(160,100,100,20); 
    Font styleFour = new Font ("Arial", Font.BOLD,13); 
    lblPhone.setFont(styleFour); 
    panel.add(lblPhone); 
    txtPhone = new JTextField(); 
    txtPhone.setBounds(210,100,150,20); 
    panel.add(txtPhone); 

    lblEmail = new JLabel("Email"); 
    lblEmail.setBounds(410,100,100,20); 
    Font styleFive = new Font ("Arial", Font.BOLD,13); 
    lblEmail.setFont(styleFive); 
    panel.add(lblEmail); 
    txtEmail = new JTextField(); 
    txtEmail.setBounds(450,100,150,20); 
    panel.add(txtEmail); 

    lblAddressOne = new JLabel("Address 1"); 
    lblAddressOne.setBounds(145,150,100,20); 
    Font styleSix = new Font ("Arial", Font.BOLD,13); 
    lblAddressOne.setFont(styleSix); 
    panel.add(lblAddressOne); 
    txtAddressOne = new JTextField(); 
    txtAddressOne.setBounds(210,150,150,20); 
    panel.add(txtAddressOne); 

    lblAddressTwo = new JLabel("Address 2"); 
    lblAddressTwo.setBounds(145,200,100,20); 
    Font styleSeven = new Font ("Arial", Font.BOLD,13); 
    lblAddressTwo.setFont(styleSeven); 
    panel.add(lblAddressTwo); 
    txtAddressTwo = new JTextField(); 
    txtAddressTwo.setBounds(210,200,150,20); 
    panel.add(txtAddressTwo); 

    lblCity = new JLabel("City"); 
    lblCity.setBounds(180,250,100,20); 
    Font styleEight = new Font ("Arial", Font.BOLD,13); 
    lblCity.setFont(styleEight); 
    panel.add(lblCity); 
    txtCity = new JTextField(); 
    txtCity.setBounds(210,250,150,20); 
    panel.add(txtCity); 

    lblPostCode = new JLabel("Post Code"); 
    lblPostCode.setBounds(380,250,100,20); 
    Font styleNine = new Font ("Arial", Font.BOLD,13); 
    lblPostCode.setFont(styleNine); 
    panel.add(lblPostCode); 
    txtPostCode = new JTextField(); 
    txtPostCode.setBounds(450,250,150,20); 
    panel.add(txtPostCode); 
} 
public void Image() { 
    ImageIcon image = new ImageIcon("icon.png"); 
    lblPicture = new JLabel(image); 
    lblPicture.setBounds(600,90, 330, 270); 
    panel.add(lblPicture); 
} 
public void Buttons() { 
    btSave = new JButton ("Save"); 
    btSave.setBounds(380,325,100,20); 
    panel.add(btSave); 
    btSave.addActionListener(new SaveListener(btDelete)); 

    btDelete = new JButton ("Delete"); 
    btDelete.setBounds(260,325,100,20); 
    panel.add(btDelete); 
    btDelete.addActionListener(new DeleteListener()); 

    btExit = new JButton ("Exit"); 
    btExit.setBounds(500,325,100,20); 
    panel.add(btExit); 
    btExit.addActionListener(new Action()); 
} 
public void List() { 
    listModel = new DefaultListModel<String>(); 
    listModel.addElement("Daniel Walker"); 
    listModel.addElement("John Smith"); 
    listModel.addElement("Bob Jones"); 

    //JList 
    list = new JList<String>(listModel); 
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    list.setSelectedIndex(0); 
    list.setVisibleRowCount(5); 
    list.setBounds(0,10,125,350); 
    panel.add(list); 


} 

static class Action implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     JFrame option = new JFrame(); 
     int n = JOptionPane.showConfirmDialog(option, 
       "Are you sure you want to exit?", 
       "Exit?", 
       JOptionPane.YES_NO_OPTION); 
     if(n == JOptionPane.YES_OPTION){ 
      System.exit(0); 
     } 
    } 

} 

class SaveListener implements ActionListener, DocumentListener { 
    private boolean alreadyEnabled = false; 
    private JButton button; 

    public SaveListener(JButton button) { 
     this.button = button; 
    } 

    //Required by ActionListener. 
    public void actionPerformed(ActionEvent e) { 

     String name = txtFirstName.getText(); 

     //User didn't type in a unique name... 
     if (name.equals("") || alreadyInList(name)) { 
      Toolkit.getDefaultToolkit().beep(); 
      txtFirstName.requestFocusInWindow(); 
      txtFirstName.selectAll(); 
      return; 
     } 

     int index = list.getSelectedIndex(); //get selected index 
     if (index == -1) { //no selection, so insert at beginning 
      index = 0; 
     } else {   //add after the selected item 
      index++; 
     } 

     listModel.insertElementAt(txtFirstName.getText() +" "+ txtSurname.getText(), index); 
     //print to file 
     out.println(txtFirstName.getText()); 
     out.println(txtSurname.getText()); 
     out.println(txtMiddlename.getText()); 
     out.println(txtPhone.getText()); 
     out.println(txtAddressOne.getText()); 
     out.println(txtAddressTwo.getText()); 
     out.println(txtEmail.getText()); 
     out.println(txtCity.getText()); 
     out.println(txtPostCode.getText()); 
     out.close(); 

     //Reset the text field. 
     txtFirstName.requestFocusInWindow(); 
     txtSurname.requestFocusInWindow(); 
     txtMiddlename.requestFocusInWindow(); 
     txtPhone.requestFocusInWindow(); 
     txtAddressOne.requestFocusInWindow(); 
     txtAddressTwo.requestFocusInWindow(); 
     txtEmail.requestFocusInWindow(); 
     txtCity.requestFocusInWindow(); 
     txtPostCode.requestFocusInWindow(); 
     txtFirstName.setText(""); 
     txtSurname.setText(""); 
     txtMiddlename.setText(""); 
     txtPhone.setText(""); 
     txtAddressOne.setText(""); 
     txtAddressTwo.setText(""); 
     txtEmail.setText(""); 
     txtCity.setText(""); 
     txtPostCode.setText(""); 
     //Select the new item and make it visible. 
     list.setSelectedIndex(index); 
     list.ensureIndexIsVisible(index); 
    } 


    protected boolean alreadyInList(String name) { 
     return listModel.contains(name); 
    } 

    //Required by DocumentListener. 
    public void insertUpdate(DocumentEvent e) { 
     enableButton(); 
    } 

    //Required by DocumentListener. 
    public void removeUpdate(DocumentEvent e) { 
     handleEmptyTextField(e); 
    } 

    //Required by DocumentListener. 
    public void changedUpdate(DocumentEvent e) { 
     if (!handleEmptyTextField(e)) { 
      enableButton(); 
     } 
    } 

    private void enableButton() { 
     if (!alreadyEnabled) { 
      button.setEnabled(true); 
     } 
    } 

    private boolean handleEmptyTextField(DocumentEvent e) { 
     if (e.getDocument().getLength() <= 0) { 
      button.setEnabled(false); 
      alreadyEnabled = false; 
      return true; 
     } 
     return false; 
    } 
} 

public void valueChanged(ListSelectionEvent e) { 
    if (e.getValueIsAdjusting() == false) { 
     if (list.getSelectedIndex() == -1) { 
      btDelete.setEnabled(false); 

     } else { 
      btDelete.setEnabled(true); 
     } 
    } 

} 
class DeleteListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 

     int index = list.getSelectedIndex(); 
     listModel.remove(index); 
     int size = listModel.getSize(); 
     if (size == 0) { 
      btDelete.setEnabled(false); 
     } else { 
      if (index == listModel.getSize()) { 
       index--; 
      } 
      list.setSelectedIndex(index); 
      list.ensureIndexIsVisible(index); 
     } 

    } 
} 

}

+1

제목을 더 유익하게 만들 수 있습니까? 그리고 예외가 던져지는 줄을 지적해야합니다. 또 다른 중요한 것 .. 포스트 관련 부분 만 .. – Maroun

+0

라인 40과 31은 어느 것입니까? 어떤 일을하든, 당신은'null'이 아닌 것처럼'null' 객체를 사용하려고합니다. –

+0

알아낼 수있는 주요 방법에 문제가 있습니다. –

답변

4
다음

당신이 NPE를 얻고있다. 패널을 초기화하지 않았습니다. 나는 MyPanel 방법으로 전화하는 걸 잊었다 고 생각합니다.

frame.add(panel);  

이 NPE를 해결합니다.

MyPanel(); //Call this method in constructor before this line. 
frame.add(panel); 
+0

오류는 사라졌지 만 프레임은 여전히 ​​배경색이 비어있어 내용이 없습니다. –

+0

'NPE'이 (가) 지금 해결되었으므로 내용이없는 또 다른 오류가 발생했다고 생각합니다. –