+ -
当前位置:首页 → 问答吧 → 在JPanel 上画图

在JPanel 上画图

时间:2011-10-16

来源:互联网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Point;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.FlowLayout;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JColorChooser;
 
public class Printer extends JPanel
{
  private JButton changeColorJButton;
  private JButton cleanColorJButton;
  private Point[] points = new Point[100000];
  private JPanel buttonJPanel;
  private int pointCount = 0;
  private int newPointCount = 0;
  private Color color = Color.WHITE;
  private Color newColor;
  
  public Printer()
  {
    this.setLayout( new BorderLayout() );
    changeColorJButton = new JButton("Change Color");
    cleanColorJButton = new JButton("Clean Color");
    buttonJPanel = new JPanel();
    this.setBackground( Color.WHITE );
    buttonJPanel.setLayout( new FlowLayout() );
    buttonJPanel.add( changeColorJButton );
    buttonJPanel.add( cleanColorJButton );
    add( buttonJPanel, BorderLayout.SOUTH );
    
    addMouseMotionListener(
         new MouseMotionAdapter()
         {
           public void mouseDragged( MouseEvent event )
           {
             if ( pointCount < points.length )
             {
               points[ pointCount ] = event.getPoint();
               pointCount++;
               repaint();
             }
           }
           public void mouseClicked( MouseEvent event )
           {
             if ( pointCount < points.length )
             {
               points[ pointCount ] = event.getPoint();
               pointCount++;
               repaint();
             }
           }
         }
        );
    changeColorJButton.addActionListener(
         new ActionListener()
         {
           public void actionPerformed( ActionEvent event )
           {
             newColor = JColorChooser.showDialog( Printer.this, "请选一个颜色", color );
                          if ( newColor == null )
               newColor = color;
             color = newColor;
             newPointCount = pointCount;
           }
         }
        );
    
  }
  
  public void paintComponent( Graphics g )
  {
    super.paintComponent(g);
    
    for( int i = newPointCount ; i < pointCount ; i++ )
    {
      g.setColor( color );
      g.fillOval( points[i].x, points[i].y, 4, 4);
    }
  }
}


小弟有两个疑问,(1)为什么 51~58行的 mouseClicked完全没效果呢?
(2)为什么重新选色后,之前所画的图就会全部消失呢?
谢谢各位!!

作者: lonely741215   发布时间: 2011-10-16


(1)为什么 51~58行的 mouseClicked完全没效果呢?

因为MouseMotionAdapter里并无mouseClicked这个method, 所以此段程式永远不会被执行到,
MouseListener则有此method,所以加入MouseListener即可解决此问题

作者: weber   发布时间: 2011-11-10