最近接触到Swing,想做一个画板,画版上有3个按钮,一个可以设置笔的粗细,一个可以获取颜色,一个点了以后使用橡皮....
第一次用最简单的想法,就是用JFrame做为画板,然后把三个按钮安置上去,这样确实成功了,但是只要用paint方法,第一次进入肯定看不到三个按钮,要把鼠标挪上去才出来,画出的图,会被按钮事件叫出的窗口给擦去,三个BUTTON也会被擦去
问了一下别人,说是JFrame的paint方法的问题.好,于是我把整个东西搬到一个JPanel上面,然后把JPanel放到JFrame里,结果还是差不多,而且更糟糕,每次使用按钮事件再绘画,按钮的图标就会重叠(也就是说又多出来三个按钮);下面有我第二次,也就是用JPanel的代码,麻烦高手们给我指点指点,在这里先谢谢各位了.
另外就是,我对paint,repaint,update方法非常陌生,只能搬着用,有高手能给讲解一下吗?还有那个Graphics也是,搞不懂

解决方案 »

  1.   

    /*这是用来安装JPanel的Frame*/import javax.swing.JFrame;
    import java.awt.Container;
    import java.awt.Toolkit;public class CreateDrawPane extends JFrame
    {
    DrawPane pane; public CreateDrawPane()
    {
    Container conPane = this.getContentPane();
    pane = new DrawPane();

    this.setTitle("画板1.01");
    this.setSize(500,500);
    this.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width-
      getSize().width)/2,
     (Toolkit.getDefaultToolkit().getScreenSize().height-
      getSize().height)/2);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    conPane.setLayout(null);
    conPane.add(pane);
    this.setVisible(true);
    }

    public static void main(String[] args)
    {
    CreateDrawPane drawpane = new CreateDrawPane();
    }
    }/*这是用来画图的JPanel*/  
    import javax.swing.JPanel;
     import javax.swing.JButton;
     import javax.swing.JColorChooser;
     import javax.swing.JOptionPane;
     import java.awt.event.ActionEvent;
     import java.awt.event.ActionListener;
     import java.awt.event.MouseMotionAdapter;
     import java.awt.event.MouseAdapter;
     import java.awt.event.MouseEvent;
     import java.awt.event.InputEvent;
     import java.awt.Color;
     import java.awt.Graphics;
     
     public class DrawPane extends JPanel implements ActionListener
     {
      Color exchangeColor = Color.black;
      private int x = -1;
      private int y = -1;
      private int penH = 2;
      private boolean clearFlag = false;
     
      JButton clearBtn;
      JButton penBtn;
      JButton colorBtn;
     
      Graphics externG;
     
      public DrawPane()
      {
    this.setLayout(null);
      this.setBackground(Color.white);
      this.setSize(500,500);
        
      clearBtn = new JButton("橡皮");
      penBtn = new JButton("粗细");
      colorBtn = new JButton("颜色调整");
      clearBtn.setBounds(2,2,60,20);
      clearBtn.setVisible(true);
      penBtn.setBounds(63,2,60,20);
      penBtn.setVisible(true);
      colorBtn.setBounds(126,2,60,20);
          colorBtn.setVisible(true);
      clearBtn.addActionListener(this);
      penBtn.addActionListener(this);
      colorBtn.addActionListener(this);
      this.add(clearBtn);
      this.add(penBtn);
    this.add(colorBtn);
      this.setVisible(true);
     
      this.addMouseMotionListener(new MouseMotionAdapter()//鼠标移动监听接口(适配器方式)
          {
          public void mouseDragged(MouseEvent e)
          {
        x = e.getX();
        y = e.getY();
        repaint();
        }
            });
            this.addMouseListener(new MouseAdapter()
                  {
                   public void mouseClicked(MouseEvent e)
                   {
                     if(e.getModifiers() == InputEvent.BUTTON3_MASK)
                     {
                      clearFlag = false;
                     }
                   }
               });
      }
     
      public void paint(Graphics g)
      {
      if(x != -1&&y != -1&&(!clearFlag))
      {
      g.setColor(exchangeColor);
      g.fillOval(x-penH/2,y-penH/2,penH,penH);
      }
      else if(clearFlag)
      {
      g.clearRect(x-penH/2,y-penH/2,penH,penH);
      }
      }
       
      public void update(Graphics g)
      {
      paint(g);
      }
     
      public void actionPerformed(ActionEvent e) //Action监听接口
      {
      if(e.getSource() == clearBtn)
      {
      clearFlag = true;
      }
      if(e.getSource() == penBtn)
      {
      try
      {
      penH = Integer.parseInt(JOptionPane.showInputDialog(this,"输入笔粗细"));
      }
      catch(Exception a)
      {
      }
      if(penH < 1)
      {
      penH = 2;
      }
      }
      if(e.getSource() == colorBtn) 
      {
      try
      {
      exchangeColor = JColorChooser.showDialog(this,"颜色选择",Color.black);
      }
      catch(Exception a)
      {
      }
      }
      }
     
      public void setClearFlag(boolean b)
      {
      clearFlag = b;
      }
     
      public void setPenH(int h)
      {
      penH = h;
      }
     
      public void setExchangeColor(Color c)
      {
      exchangeColor = c;
      }
     }
      

  2.   

    /*DrawPane*/
     import javax.swing.JPanel;
     import javax.swing.JButton;
     import javax.swing.JColorChooser;
     import javax.swing.JOptionPane;
     import java.awt.event.ActionEvent;
     import java.awt.event.ActionListener;
     import java.awt.event.MouseMotionAdapter;
     import java.awt.event.MouseAdapter;
     import java.awt.event.MouseEvent;
     import java.awt.event.InputEvent;
     import java.awt.Color;
     import java.awt.Graphics;
     
     public class DrawPane extends JPanel implements ActionListener
     {
     Color exchangeColor = Color.black;
     private int x = -1;
     private int y = -1;
     private int penH = 2;
     private boolean clearFlag = false;
     
     JButton clearBtn;
     JButton penBtn;
     JButton colorBtn;
     
     Graphics externG;
     
     public DrawPane()
     {
    this.setLayout(null);
     this.setBackground(Color.white);
     this.setSize(500,500);
       
     clearBtn = new JButton("橡皮");
     penBtn = new JButton("粗细");
     colorBtn = new JButton("颜色调整");
     clearBtn.setBounds(2,2,60,20);
     clearBtn.setVisible(true);
     penBtn.setBounds(63,2,60,20);
     penBtn.setVisible(true);
     colorBtn.setBounds(126,2,60,20);
         colorBtn.setVisible(true);
     clearBtn.addActionListener(this);
     penBtn.addActionListener(this);
     colorBtn.addActionListener(this);
     this.add(clearBtn);
     this.add(penBtn);
    this.add(colorBtn);
     this.setVisible(true);
     
     this.addMouseMotionListener(new MouseMotionAdapter()//鼠标移动监听接口(适配器方式)
        {
        public void mouseDragged(MouseEvent e)
        {
      x = e.getX();
      y = e.getY();
      repaint();
       }
          });
            this.addMouseListener(new MouseAdapter()
                 {
                 public void mouseClicked(MouseEvent e)
                 {
                   if(e.getModifiers() == InputEvent.BUTTON3_MASK)
                   {
                   clearFlag = false;
                   }
                 }
              });
     }
     
     public void paintComponent(Graphics g)
     {
     if(x != -1&&y != -1&&(!clearFlag))
     {
     g.setColor(exchangeColor);
     g.fillOval(x-penH/2,y-penH/2,penH,penH);
     }
     else if(clearFlag)
     {
     g.clearRect(x-penH/2,y-penH/2,penH,penH);
     }
     }
     
     public void actionPerformed(ActionEvent e) //Action监听接口
     {
     if(e.getSource() == clearBtn)
     {
     clearFlag = true;
     }
     if(e.getSource() == penBtn)
     {
     try
     {
    clearFlag = false;
     penH = Integer.parseInt(JOptionPane.showInputDialog(this,"输入笔粗细"));
     }
     catch(Exception a)
     {
     }
     if(penH < 1)
     {
     penH = 2;
     }
     }
     if(e.getSource() == colorBtn) 
     {
     try
     {
     clearFlag = false;
     exchangeColor = JColorChooser.showDialog(this,"颜色选择",Color.black);
     }
     catch(Exception a)
     {
     }
     }
     }
     
     public void setClearFlag(boolean b)
     {
     clearFlag = b;
     }
     
     public void setPenH(int h)
     {
     penH = h;
     }
     
     public void setExchangeColor(Color c)
     {
     exchangeColor = c;
     }
     }
      

  3.   

    paint画所有, 包括border, 子组件, 自己
    paintComponent画自己. 你重写paint方法, 所以button没有, 别你画掉了....