2012-07-05 29 views
0

我可以让程序出现并用一种颜色绘制,但如果点击其中一个按钮,它将不会改变颜色。我不断收到空指针异常。我认为这可能是因为我没有初始化图形,图像或两者。如果是这个问题,我不太清楚如何去解决这个问题。我相当新的编程和任何帮助将不胜感激。更改我的Java绘画程序中的颜色

代码:

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(); 
     } 
    } 
+0

哪条线是被抛出的NPE? – JRSofty 2012-07-05 14:30:58

+0

欢迎来到Stack Overflow!请将您的代码示例限制在相关部分。理想的示例是[简短,独立和可编译](http://sscce.org/)。通读整个源代码非常耗时,并且会为您提供更少的答案。 – 2012-07-05 14:31:49

+0

'私人Graphics2D克;'问题开始那里,我怀疑..图形对象通常是短暂的 - 那里,走了。 – 2012-07-05 14:32:46

回答

1

您正在从按钮监听器调用red()方法,并且一旦您使用了x1,x2,y1和你调用drawLine时的y2值。你在哪里初始化这些变量?

您正在依靠那些用鼠标点击时应写入的变量,但这可能不会发生。尝试在构造函数中初始化它们。

1

存储您的图形对象是什么天色你陷入困境。简单的答案是所有绘画都需要通过JComponent.paintComponent(...)来完成,因此您的red()green()blue()应该由paintComponent通过paintComponent的Graphics对象调用。

从根本上讲, java绘画的作品是,通过回调paint()/ paintcomponent(),所有东西都被绘制在同一个循环中。该机制以这种方式工作,以便组件可以在不同的时间,不同的鼠标/点击状态等看起来不同。