Reputation: 197
I've got an applet with radio buttons to select the color of the line, but when I try to run it, I get this error:
java.lang.NullPointerException
This is what I have thus far. Any suggestions on making color selection work?
import java.awt.*;
import java.applet.*;
import javax.swing.*;
import java.awt.event.*;
public class ProjectPaint extends Applet {
private JRadioButton redButton = new JRadioButton("Red");
private JRadioButton blueButton = new JRadioButton("Blue");
private JRadioButton greenButton = new JRadioButton("Green");
private JRadioButton blackButton = new JRadioButton("Black");
Graphics g;
public void init() {
// Create a border layout design
setLayout(new BorderLayout());
// Make a new object of type DrawPanel
DrawPanel dp = new DrawPanel();
// Add a draw panel in the center
add("Center", dp);
// Add another draw panel for color selection on top
add("North",new DrawControls(dp));
}
int x1;
int y1;
class DrawPanel extends Panel
{
public boolean mouseDown(Event e, int x, int y)
{
// User has started a mouse drag.
// Remember where:
x1 = x;
y1 = y;
return true;
}
public boolean mouseDrag(Event e, int x, int y)
{
// User is continuing a mouse drag.
// Draw line from last point to this
// point:
g = getGraphics();
g.drawLine( x1,y1, x,y );
// Remember new "last point":
x1 = x;
y1 = y;
return true;
}
}
class DrawControls extends Panel
{
public DrawControls(DrawPanel target)
{
setLayout(new BorderLayout());
JPanel panel = new JPanel();
ButtonGroup radioButtonGroup = new ButtonGroup();
radioButtonGroup.add(redButton);
radioButtonGroup.add(blueButton);
radioButtonGroup.add(greenButton);
radioButtonGroup.add(blackButton);
panel.add(redButton);
panel.add(blueButton);
panel.add(greenButton);
panel.add(blackButton);
add(panel, BorderLayout.NORTH);
redButton.addActionListener(new RadioButtonListener());
blueButton.addActionListener(new RadioButtonListener());
greenButton.addActionListener(new RadioButtonListener());
blackButton.addActionListener(new RadioButtonListener());
blackButton.doClick();
}
}
private class RadioButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
int color = -1;
if(e.getSource() == redButton)
{
g.setColor(Color.red);
}
if(e.getSource() == blueButton)
{
g.setColor(Color.blue);
}
if(e.getSource() == greenButton)
{
g.setColor(Color.green);
}
if(e.getSource() == blackButton)
{
g.setColor(Color.black);
}
}
}
}
Upvotes: 0
Views: 2336
Reputation: 159804
The Graphics
reference has not been assigned hence the NPE
.
Don't attempt any custom painting from an ActionListener
or MouseListener
. Instead use a Color
class member variable to set the color. For Swing applications, all custom painting should be done in the paintComponent
method. In this case DrawPanel
will need to changed so as to extend JPanel
so that it can override the method. Add the @Override
annotation and make sure to invoke super.paintComponent(g)
.
JApplet
has support for the JFC/Swing component architecture so use that also.
Upvotes: 3