题目要求在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);
}
}
}
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);
}
}
}
这句放在actionPerformed方法里,只有按钮按下才执行