我可以让程序出现并用一种颜色进行绘制,但如果我单击其中一个按钮,它不会改变颜色。我不断收到空指针异常。我认为这可能是因为我没有初始化图形、图像或两者。如果是那个问题,我不太确定如何解决这个问题。我对编程相当陌生,任何帮助将不胜感激。
代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Paint extends JFrame{
//Class Variables
private JFrame frame;
PaintPanel paint_panel;
private JPanel btn_panel;
private JButton red_btn, green_btn, blue_btn, clear_btn, erase_btn ;
//class to paint the panel in the frame
public class PaintPanel extends JComponent{
//Class Variables
private Graphics2D g;
private int x1, y1, x2, y2;
private Cursor paint_cursor, select_cursor;
private Image image;
//Constructor with Mouse listeners in it
public PaintPanel(){
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
x1 = e.getX();
y1 = e.getY();
}
});
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
x2 = e.getX();
y2 = e.getY();
if(g != null)
g.drawLine(x1, y1, x2, y2);
repaint();
x1 = x2;
y1 = y2;
}
});
}
//PaintPanel Method that sets the cursor and does the drawing
public void paintComponent(Graphics gr){
super.paintComponent(gr);
gr.setColor(Color.black);
gr.fillRect(0, 0, this.getWidth(), this.getHeight());
paint_cursor=new Cursor(Cursor.CROSSHAIR_CURSOR);
select_cursor=new Cursor(Cursor.HAND_CURSOR);
paint_panel.setCursor(paint_cursor);
btn_panel.setCursor(select_cursor);
if(image == null){
image = createImage(this.getWidth(), this.getHeight());
g = (Graphics2D)image.getGraphics();
clear1();
}
gr.drawImage(image, 0, 0, null);
}
public void clear1(){
g.setPaint(Color.black);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
g.setPaint(Color.blue);
repaint();
}
public void red(){
g.drawLine(x1, y1, x2, y2);
g.setPaint(Color.red);
x1 = x2;
y1 = y2;
repaint();
}
public void blue(){
g.drawLine(x1, y1, x2, y2);
g.setPaint(Color.blue);
x1 = x2;
y1 = y2;
repaint();
}
public void green(){
g.drawLine(x1, y1, x2, y2);
g.setPaint(Color.green);
x1 = x2;
y1 = y2;
repaint();
}
}
//Constructor
public Paint(){
frame = new JFrame("Paint Program");
frame.setSize(500,500);
frame.setLocation(500,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
red_btn = new JButton("RED");
green_btn = new JButton("GREEN");
blue_btn = new JButton("BLUE");
clear_btn = new JButton("CLEAR");
erase_btn = new JButton("ERASE");
btn_panel = new JPanel();
paint_panel = new PaintPanel();
btn_panel.setLayout(new GridLayout(5,1));
btn_panel.add(red_btn);
btn_panel.add(green_btn);
btn_panel.add(blue_btn);
btn_panel.add(clear_btn);
btn_panel.add(erase_btn);
frame.add(BorderLayout.CENTER, paint_panel);
frame.add(BorderLayout.EAST, btn_panel);
final PaintPanel pp1 = new PaintPanel();
red_btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
pp1.red();
}
});
blue_btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
pp1.blue();
}
});
green_btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
pp1.green();
}
});
clear_btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
pp1.clear1();
}
});
erase_btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
pp1.green();
}
});
}
//Makes the frame visible and working
public void launch(){
frame.setVisible(true);
}
//Main Method
public static void main(String[] args){
Paint p1 = new Paint();
p1.launch();
}
}