Tony White
Tony White

Reputation: 197

How to select color for g.drawLine?

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

Answers (1)

Reimeus
Reimeus

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

Related Questions