首先要求做出个登录界面,要求像QQ那样点击登录然后销毁登录框弹出一个新的画板界面。
public class MyDrawIn { private JFrame jf; //主方法 public static void main(String[] args) { MyDrawIn md = new MyDrawIn(); md.showDraw(); } //显示登录主界面 public void showDraw() { jf = new JFrame("登录我的画板"); //初始化界面 jf.setSize(200, 200); jf.setResizable(false); FlowLayout fl = new FlowLayout(); //创建一个登录按钮 JButton bu = new JButton("登录"); bu.setActionCommand("登录"); //设置这个鼠标的监听器对象,并且加到这个按钮上 ActionListener al = new MyActionListener(jf); //将监听器加载到bu上 bu.addActionListener(al); jf.add(bu); jf.setLayout(fl); //设置退出关闭程序,显示界面 jf.setDefaultCloseOperation(3); jf.setVisible(true); } }
然后这个是登录界面的按钮监听器,按书上说的是可以用匿名的实现类来把监听器加到按登录按钮上的,但是在两次写这个画图板的时候两次都被康哥提醒说这个是个偷懒的方法,不利于大点的程序的调试,而且对传值等的理解也不利,所以还是新建了一个MyActionListener类来实现ActionListener接口,老老实实new一个实名类来加到监听器上
public class MyActionListener implements ActionListener{ private JFrame jf1; public MyActionListener(JFrame jf) { jf1 = jf; } public void actionPerformed(ActionEvent e){ jf1.dispose(); MyDraw md = new MyDraw(); md.showMyDraw(); } }
然后就进入到画板的界面了!刚开始的时候大概之前写C都是写的过程程序,都基本是顺序执行,犯二了把画的功能写在了画板的界面的类里面,导致画板一显示出来什么都画不出来,后来康哥提醒了,说把画的功能写在初始化窗体类上,这样程序一运行结束了就什么都画不了了,要写在MouseRelese()里面才能画上去。
public class MyDraw { //显示我的画板界面 public void showMyDraw() { JFrame jf = new JFrame(); jf.setVisible(false); jf = new JFrame("我的画板"); //初始化界面 jf.setSize(500, 500); jf.setResizable(false); FlowLayout fl = new FlowLayout(); jf.setLayout(fl); //创建选择图形的按钮 JButton bu_line = new JButton("line"); JButton bu_rect = new JButton("rect"); JButton bu_oval = new JButton("oval"); bu_line.setActionCommand("Line"); bu_rect.setActionCommand("Rect"); bu_oval.setActionCommand("Oval"); // ShapeActionListener al = new ShapeActionListener(); bu_line.addActionListener(al); bu_rect.addActionListener(al); bu_oval.addActionListener(al); jf.add(bu_oval); jf.add(bu_rect); jf.add(bu_line); jf.setDefaultCloseOperation(3); jf.setVisible(true); Graphics g = jf.getGraphics(); //设置鼠标监听器 MouseListener ml = new MyMouseListener(g, al); jf.addMouseListener(ml); }
然后就是要根据画板上添加的选择图形的按钮来画出相应的图形了,所以把选择按钮加上ShapeActionListener监听器,好像可以加载和登录按钮同一个监听器,只需要把每个按钮都注上标识根据标识来采取同一个监听器里不同的功能,但是好像对于新手来说不太好理解,所以写这个的时候就没有这样做了,完成这个画板之后会尝试下这样做,好像会减少文件数。
public class ShapeActionListener implements ActionListener{ public int shape = 0; public void actionPerformed(ActionEvent e){ if(e.getActionCommand().equals("Line")){ shape = 0; }else if(e.getActionCommand().equals("Rect")){ shape = 1; }else if(e.getActionCommand().equals("Oval")){ shape = 2; } } }
最后就是鼠标监听器了,按下第一个点记录下来,按下第二个点也记录下来,然后马上根据这两个点画出图形。
public class MyMouseListener implements MouseListener { public int x1, y1, x2, y2; private Graphics g; private ShapeActionListener al; public MyMouseListener(Graphics g, ShapeActionListener al) { this.g = g; this.al = al; } // 当鼠标释放时记录第二个点,并画图 public void mouseReleased(MouseEvent e) { x2 = e.getX(); y2 = e.getY(); // 画 if (al.shape == 0){ g.drawLine(x1, y1, x2, y2); } else if(al.shape==1) /* 立体矩形 * for(int i=0;i<256;i++){ g.setColor(new Color(i,i,i)); g.drawRect(x1+i, y1-i, x2-x1, y2-y1); } */ for(int i=0;i<100;i++){ g.setColor(new Color(255-i,255-i,255-i)); g.drawRect(x1, y1, x2-x1, y2-y1); x1--; x2++; y1++; y2++; } else if (al.shape==2){ g.drawOval(x1, y1++, x2-x1, y2-y1); } /**立体圆柱 * for(int i=0;w>0&&h>0;i++){ g.setColor(new Color(i,i,i)); g.drawOval(x1, y1++, w, h); } */ } // 当鼠标按下时记录第一个点 public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); }; public void mouseClicked(MouseEvent e) { }; public void mouseEntered(MouseEvent e) { }; public void mouseExited(MouseEvent e) { }; }
值得注意的是:1.获取画布区域Graphics g得在窗体显示之后才能获取。
2.在获取所选图形的按钮监听器对象中的属性shape时,要改权限public不然的话就在监听器实现类里面写一个返回shape的方法来获取shape。