所以我正在编写一个程序,以允许用户输入我所设计的"小说"one_answers"杂志"类的属性的文本值,但是我是我在我的ActionListener上有一个问题,每当我触发动作时,它会给我一个无效的指针例外。我的猜测是与我拥有Switch语句
有关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;
}
从本质上讲,我要它做的是能够以适当的属性值调用createObject()方法,然后显示使用两个类包含的toString()方法创建的对象的joptionpane的消息对话框。我知道这个问题不是来自其中任何一个类的方法语法,因此我不一定了解问题来自哪里。
这是源代码:
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());
}
}
这是来自错误消息的文字:http://pastebin.com/hri9jbsd
任何帮助都非常感谢!
默认情况下,java将null分配给新的定义变量。这个静态变量
static Magazine theMagazine;
将其传递给createObject(...)
方法时为null。
您需要创建新的杂志对象(或以某种方式加载它)并将其分配给theMagazine
变量。