题目要求在TextField中输入整数,点击button后,在frame上画出表示该整数的柱状图,每输入一个整数,点击button就多画出一个柱状(其实就是一个矩形),写了代码如下,可通过javac后,在java运行时报错:
Exception in thread "main" java.lang.NullPointerException,好像问题出在createPanel()函数的panel.add(component);这句,请帮忙看看问题在哪,该如何修改。写的代码如下:
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.JComponent;
import java.util.ArrayList;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;public class SavingsCalculator
{
    public static void main(String[] args)
    {
        JFrame frame = new BarChartFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("SavingsCalculator");
        frame.setVisible(true);
    }
}class BarChartFrame extends JFrame
{
private JTextField SavingsTextField;
private JButton button;
private JPanel panel;
private ArrayList<Integer> savings;
private BarChartComponent component;

private static final int FRAME_WIDTH=600;
private static final int FRAME_HEIGHT=600;
private static final int FIELD_LENGTH=10;
private static final int DEFAULT_SAVINGS=0;

public BarChartFrame()
{
  savings = new ArrayList<Integer>();

  createTextField();
  createButton();
  createPanel();
  
  setSize(FRAME_WIDTH,FRAME_HEIGHT);
}

private void createTextField()
{
SavingsTextField=new JTextField(FIELD_LENGTH);
SavingsTextField.setText(""+DEFAULT_SAVINGS);
}

private void createButton()
{
button = new JButton("Add value");

class buttonListener implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
int saving = Integer.parseInt(SavingsTextField.getText());
                                       savings.add(saving);
                                      component = new BarChartComponent(savings);
                             }
                    }
     
                   ActionListener listener = new buttonListener();
                   button.addActionListener(listener);
          }
   
   private void createPanel()
   {
    panel =new JPanel();
    panel.add(SavingsTextField);
    panel.add(button);
    panel.add(component);
   
    add(panel);
   }
 
}class BarChartComponent extends JComponent
{
private ArrayList<Integer> savingsArr;
private static final int xWidth=500;
private static final int yHeight=500;
private int count,xDistance;
private static final int xBase = 50;
private static final int yBase = 550;

public BarChartComponent(ArrayList<Integer> a)
{
savingsArr = a;
count=savingsArr.size();
}

public void paintComponent(Graphics g)
{
Graphics2D g2=(Graphics2D)g;

xDistance = xWidth/count;

for(int i=0;i<count;i++)
{
int h=savingsArr.get(i);
Rectangle rectangle = new Rectangle(xBase+xDistance*i,yBase-h,xDistance,h);
g2.draw(rectangle);
}
}
}