2017-02-21 1 views
-1

J'ai donc un programme que j'écris pour permettre à l'utilisateur d'entrer des valeurs de texte pour les attributs d'une classe "Novel" et "Magazine" que j'ai conçu, mais j'ai un problème avec mon actionListener où il me donne une exception de pointeur nul chaque fois que je déclenche l'action. Je suppose qu'il a quelque chose à voir avec moi ayant l'instruction switchJButton actionPerformed méthode donnant Null

switch(theList.getSelectedIndex()){ 
       case -1: JOptionPane.showMessageDialog(null, "You did not select an object type to create!", "Error!", JOptionPane.ERROR_MESSAGE); 
         break; 
       case 0: createObject(theMagazine, titleField, authorField, publisherField, publisherLocationField, copyrightYearField, priceEnterField, ISBNEnterField); 
         JOptionPane.showMessageDialog(null, theMagazine.toString(), "This is The Magazine You Created!", JOptionPane.INFORMATION_MESSAGE); 
         break; 
       case 1: createObject(theNovel, titleField, authorField, publisherField, publisherLocationField, copyrightYearField, priceEnterField, ISBNEnterField); 
         theNovel.setHardCover(Boolean.parseBoolean(JOptionPane.showInputDialog(null,"Is this Book a hard cover or not?","Question!",JOptionPane.QUESTION_MESSAGE))); 
         JOptionPane.showMessageDialog(null, theNovel.toString(), "This is The Magazine You Created!", JOptionPane.INFORMATION_MESSAGE); 
         break; 
      } 

Essentiellement ce que je veux faire est d'être en mesure d'appeler la méthode CreateObject() pour les valeurs d'attributs appropriés, puis afficher la boîte de dialogue de message du JOptionPane pour l'objet créé à l'aide de la méthode toString() contenue dans ces deux classes. Je sais que le problème ne vient pas de la syntaxe de la méthode de l'une ou l'autre de ces classes, donc je ne comprends pas nécessairement d'où vient le problème.

Voici le code source:

import javax.swing.*; 
import javax.swing.border.*; 
import java.awt.event.*; 
import java.awt.*; 
@SuppressWarnings({"serial"}) 
public class GUI extends JFrame{ 

static Magazine theMagazine; 
static Novel theNovel; 

public static void main(String[] args){ 
    final String[] objectTypes = {"Magazine","Novel"}; 
    final Border textFieldBorder = BorderFactory.createLineBorder(Color.black, 1); 
    final Font theFont = new Font("Times New Roman", 0, 25); 
    final JLabel typeSelect = new JLabel("Please select the literature type!"); 
    final JLabel titleEnter = new JLabel("Enter the title here!"); 
    final JLabel authorEnter = new JLabel("Enter the Author here!"); 
    final JLabel publisherEnter = new JLabel("Enter the publisher here!"); 
    final JLabel pubLocationEnter = new JLabel("Enter the Publishers location here"); 
    final JLabel enterCopyrightYear = new JLabel("Enter the copyright year here!"); 
    final JLabel priceEnter = new JLabel("Enter the price here!"); 
    final JLabel ISBNEnter = new JLabel("Enter the ISBN here!");  

    JList<String> theList = new JList<String>(objectTypes); 
    theList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    theList.setLayoutOrientation(JList.HORIZONTAL_WRAP); 
    theList.setVisibleRowCount(-1); 
    theList.setBorder(textFieldBorder); 
    theList.setFont(theFont); 

    JTextField titleField = new JTextField(); 
    titleField.setBorder(textFieldBorder); 
    titleField.setFont(theFont); 
    titleField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField authorField = new JTextField(); 
    authorField.setBorder(textFieldBorder); 
    authorField.setFont(theFont); 
    authorField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField publisherField = new JTextField(); 
    publisherField.setBorder(textFieldBorder); 
    publisherField.setFont(theFont); 
    publisherField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField publisherLocationField = new JTextField(); 
    publisherLocationField.setBorder(textFieldBorder); 
    publisherLocationField.setFont(theFont); 
    publisherLocationField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField copyrightYearField = new JTextField(); 
    copyrightYearField.setBorder(textFieldBorder); 
    copyrightYearField.setFont(theFont); 
    copyrightYearField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField priceEnterField = new JTextField(); 
    priceEnterField.setBorder(textFieldBorder); 
    priceEnterField.setFont(theFont); 
    priceEnterField.setHorizontalAlignment(JTextField.CENTER); 
    JTextField ISBNEnterField = new JTextField(); 
    ISBNEnterField.setBorder(textFieldBorder); 
    ISBNEnterField.setFont(theFont); 
    ISBNEnterField.setHorizontalAlignment(JTextField.CENTER); 

    JButton createObject = new JButton("Create an Object!"); 
    createObject.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent event){ 
      switch(theList.getSelectedIndex()){ 
       case -1: JOptionPane.showMessageDialog(null, "You did not select an object type to create!", "Error!", JOptionPane.ERROR_MESSAGE); 
         break; 
       case 0: createObject(theMagazine, titleField, authorField, publisherField, publisherLocationField, copyrightYearField, priceEnterField, ISBNEnterField); 
         JOptionPane.showMessageDialog(null, theMagazine.toString(), "This is The Magazine You Created!", JOptionPane.INFORMATION_MESSAGE); 
         break; 
       case 1: createObject(theNovel, titleField, authorField, publisherField, publisherLocationField, copyrightYearField, priceEnterField, ISBNEnterField); 
         theNovel.setHardCover(Boolean.parseBoolean(JOptionPane.showInputDialog(null,"Is this Book a hard cover or not?","Question!",JOptionPane.QUESTION_MESSAGE))); 
         JOptionPane.showMessageDialog(null, theNovel.toString(), "This is The Magazine You Created!", JOptionPane.INFORMATION_MESSAGE); 
         break; 
      } 
     } 
    }); 
    JButton closeProgram = new JButton("Close the program!"); 
    closeProgram.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent event){ 
      System.exit(0); 
     } 
    }); 

    JPanel thePanel = new JPanel(); 
    thePanel.setLayout(new GridLayout(9,2)); 

    JFrame theFrame; 

    //first row 
    thePanel.add(typeSelect); 
    thePanel.add(theList); 

    //second row 
    thePanel.add(titleEnter); 
    thePanel.add(titleField); 

    //third row 
    thePanel.add(authorEnter); 
    thePanel.add(authorField); 

    //fourth row 
    thePanel.add(publisherEnter); 
    thePanel.add(publisherField); 

    //fifth row 
    thePanel.add(pubLocationEnter); 
    thePanel.add(publisherLocationField); 

    //sixth row 
    thePanel.add(enterCopyrightYear); 
    thePanel.add(copyrightYearField); 

    //seventh row 
    thePanel.add(priceEnter); 
    thePanel.add(priceEnterField); 

    //eighth row 
    thePanel.add(ISBNEnter); 
    thePanel.add(ISBNEnterField); 

    //ninth row 
    thePanel.add(createObject); 
    thePanel.add(closeProgram); 

    theFrame = new JFrame(); 
    theFrame.add(thePanel); 
    theFrame.setTitle("Literature Creator!"); 
    theFrame.setSize(500,500); 
    theFrame.setVisible(true); 
    theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    theFrame.setResizable(false); 

} 
public static void createObject(Literature theLiterature, JTextField titleField, JTextField authorField, JTextField publisherField, JTextField publisherLocationField, 
         JTextField copyrightYearField, JTextField priceEnterField, JTextField ISBNEnterField){ 
    theLiterature.setTitle(parseField(titleField)); 
    theLiterature.setAuthor(parseField(authorField)); 
    theLiterature.setPublisher(parseField(publisherField)); 
    theLiterature.setPublisherLocation(parseField(publisherLocationField)); 
    theLiterature.setCopyrightYear(parseNumField(copyrightYearField)); 
    theLiterature.setPrice(parseNumField(priceEnterField)); 
    theLiterature.setISBN(parseNumField(ISBNEnterField)); 
} 
public static String parseField(JTextField field){ 
    if(field.getText() == null){ 
     JOptionPane.showMessageDialog(null, "Error! " + field.getName() + " contains no text!", "Error", JOptionPane.ERROR_MESSAGE); 
     System.exit(0); 
    } 
    return field.getText(); 
} 
public static int parseNumField(JTextField field){ 
    if(field.getText() == null){ 
     JOptionPane.showMessageDialog(null, "Error! " + field.getName() + " contains no text!", "Error", JOptionPane.ERROR_MESSAGE); 
     System.exit(0); 
    } 
    try{ 
     Integer.parseInt(field.getText()); 
    }catch(NumberFormatException nfe){ 
     JOptionPane.showMessageDialog(null, "Error! Value in field " + field.getName() + " was not a valid number!", "Error!", JOptionPane.ERROR_MESSAGE); 
     System.exit(0); 
    } 
    return Integer.parseInt(field.getText()); 
} 

}

Voici le texte du message d'erreur: http://pastebin.com/HRi9jbSD

Toute aide est grandement appréciée!

+1

Alors, où positionnez-vous 'theMagazine' pour être tout sauf nul? –

+0

@DM hahahahaha il semblerait que je l'ai fait nulle part ... Oups, une erreur stupide je suppose, mais il a été une longue longue journée. Je vous remercie! –

Répondre

0

Par défaut, Java attribue une valeur nulle à une nouvelle variable définie. Cette variable statique

static Magazine theMagazine; 

est nulle lorsque vous passez à la méthode createObject(...).

Vous devez créer un nouvel objet Magazine (ou le charger d'une manière ou d'une autre) et l'affecter à la variable theMagazine.

+0

merci! Je le réalise maintenant. J'étais conscient de cette valeur nulle par défaut, mais la journée a été plutôt longue, donc après beaucoup de scan, je n'avais toujours pas vu que ça pouvait être le problème puisque mon cerveau ne le regarnissait pas .. Cheers! –