java 画板初步实现 java画板参数传递
实际上,在一个程序中,参数的传递是无处不在的。参数传递,分为值传递和引用传递。值传递,顾名思义,就是传递的是值,只有其值发生改变。而引用传递则是地址的传递,参数中存储的实际上是一个地址。那么引用传递就可实现类的对象的传递。总而言之,值传递适用于8大基本数据类型和String类型。而引用传递则适用于对象类型。
接下来,就说说画板的初步实现。对于一个画板的创建,显然分为两部分,界面和事件监听机制。显然,界面的创建,需要先创建一个窗体,然后将窗体分为两部分(使用默认布局,边框布局即可)。一部分放置按钮,一部分实现画板。
很显然界面的实现还是相当简单的,当界面实现以后,就是事件监听机制的实现了。事件监听机制,分为三部分,一为事件源,二为事件监听器方法,三为事件处理类。显然对于按钮是使用ActionListener的动作监听方法监听,而画板则是使用MouseListener和MouseMotionListener两种鼠标监听方法。通过创建一个按钮的事件处理类来实现按钮的区别并将其按钮的命令值传给主函数所在类的属性。然后创建一个画板的事件处理类继承MouseListener和MouseMotionListener两种接口,并通过主函数所在的类的属性的引用传递,来区分当前是哪个按钮,然后对鼠标进行不同的监听处理。最后一个问题就是,如何来将画的图形显示在面板上呢?那么我们就要用到Graphics类了。这是一个画布类,其不能直接的创建一个画布,但是可以通过面板来获取画布,形式大概如:Graphics g=panelC.getGraphics(); 这样就能获取一个面板上的画布了。然后将这个画布传入鼠标事件处理类里就行了。我们需要注意的就是在面板上创建绘制图形的画布必须在设置JFrame(窗体)可见之后。
作为一个画板最基本的就是直线、铅笔、橡皮,另外的一些就是矩形、椭圆、圆角矩形、喷漆、刷子、多边形、以及颜色的选择了。而画布中本身拥有的方法有画直线、矩形、椭圆、圆角矩形,那么对于这些我们很容易就可以实现了,那么对于颜色的选择是如何实现的呢?实际上,JAVA本身就自带了一个颜色选择器,我们只需调用即可,很显然颜色选择器所选择的颜色也是用主函数所在的类中的一个属性来存储,然后传入事件处理类中。颜色处理器的实现如:JColorChooser.showDialog(null,"colorchooser",Color.black),这个语句将会实现跳出一个新的颜色选择器界面,并且当选择完颜色后,将会返回一个Color的对象。铅笔,很简单不断画直线就能轻松实现(跟随鼠标拖动而变化)。刷子,就是铅笔的加粗版,对于这个的实现只需基于铅笔,将所画的线多几条便可以了。橡皮?不就是白色的刷子么- -。喷漆的话,可以使用一个随机数来实现画点,画点的话- -不就是起始和终止位置相同的直线么。而多边形,只需使用三个坐标就行,一组记录最原始的位置,另两组记录当前和上一次的位置即可。这样,一个初步的画板就实现了。
本来的话,是想将画板的跟踪功能实现的(就是鼠标在拖动过程中,会将你在此松开的结果预先显示)。最初想法很天真 - -,就是监视鼠标拖动过程中不断的删除上一步所画结果(将上一步画的图形再用白色绘制一遍),然后画出本次预计结果,直到鼠标松开正式画出结果。但最后调试发现这样会将原本所画的东西清除掉,这样就坑爹的失败了。下面就是我的基本画板的运行图和代码:
package Doubipanel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class DoubiPanelMain { private Color color=Color.BLACK; public String str="Line"; public static void main(String[] args) { DoubiPanelMain dp=new DoubiPanelMain(); dp.initUi(); } //private PMouseLisener mouselisener; //初始化窗口方法 public JFrame initUi(){ JFrame frame=new JFrame("逗 比 画 板"); //创建动作监听类对象 BtActionListener btal=new BtActionListener(this); //设置窗口大小 frame.setSize(690,500); //设置窗口大小不可改变 frame.setResizable(false); //设置窗体位置居中 frame.setLocationRelativeTo(null);; //设置关闭 frame.setDefaultCloseOperation(3); //创建事件监听类对象 //调用添加创建北边面板的方法 creatPanelN(frame,btal); //调用添加创建中间面板的方法 JPanel panelC= creatPanelC(frame); //设置窗口可见 frame.setVisible(true); //创建绘制图形的对象 Graphics g=panelC.getGraphics(); //创建鼠标事件监听类对象 PMouseLisener mouselisener=new PMouseLisener(g,this); panelC.addMouseListener(mouselisener); panelC.addMouseMotionListener(mouselisener); return frame; } //获得actionlistener的名称的方法 public String getStr(){ return str; } public Color getColor(){ return color; } public void setColor(Color color){ this.color=color; } //添加北画板的方法 public JPanel creatPanelN(JFrame frame,BtActionListener btal){ JPanel panelN=new JPanel(); panelN.setBackground(new Color(1,250,250)); panelN.setPreferredSize(new Dimension(0,75)); String [] bt1= {"Line", "Rect", "Oval", "RoundRect", "Polygon","pencil","brush","eraser","color","spraygun"}; for (int i=0;i<10;i++){ JButton bt=new JButton(bt1[i]); bt.setActionCommand(bt1[i]); bt.addActionListener(btal); panelN.add(bt); } //将面板添加到窗口上 frame.add(panelN,BorderLayout.NORTH); return panelN; } //中间面板的方法 public JPanel creatPanelC(JFrame frame){ JPanel panelC=new JPanel(); panelC.setBackground(Color.white); //panelC.addMouseListener(mouselisener); frame.add(panelC,BorderLayout.CENTER); return panelC; } } package Doubipanel; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JColorChooser; public class BtActionListener implements ActionListener{ //构造方法 String str; DoubiPanelMain dp; public BtActionListener(DoubiPanelMain dp){ this.dp=dp; } public void actionPerformed(ActionEvent e) { /* if (e.getActionCommand().equals("Line")){ } else if(e.getActionCommand().equals("Rect")){ } else if(e.getActionCommand().equals("RoundRect")){ } else if(e.getActionCommand().equals("Polygon")){ }*/ dp.str=e.getActionCommand(); if (dp.str.equals("color")) { dp.setColor(JColorChooser.showDialog(null,"colorchooser",Color.black)); } } } package Doubipanel; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.util.Random; import javax.swing.event.MouseInputListener; public class PMouseLisener implements MouseInputListener,MouseMotionListener{ private int x,y,x1,x2,y1,y2,x0,y0; //private int x[],y[]; private int i=0,j=0; private Graphics g; private DoubiPanelMain dp; //构造方法 public PMouseLisener (Graphics g,DoubiPanelMain dp){ this.g=g; this.dp=dp; } public void mouseEntered(MouseEvent arg0) { //System.out.println(x1+" "+y1); } //记录鼠标按下 public void mousePressed(MouseEvent e) { g.setColor(dp.getColor()); if(dp.str.equals("Polygon") ){ if(i==0){ System.out.println("坑爹"); i=1; x=x0=x1=e.getX(); y=y0=y1=e.getY(); System.out.println(x1+" "+y1); } } else { x1=e.getX(); y1=e.getY(); System.out.println(x1+" "+y1); } } public void mouseDragged(MouseEvent e) { if(dp.str.equals("pencil")){ x2=e.getX(); y2=e.getY(); g.drawLine(x1, y1, x2, y2); y1=y2;x1=x2; } else if(dp.str.equals("spraygun")){ x2=e.getX(); y2=e.getY(); Random random=new Random(); for (int l=1;l<=30;l++){ int j=random.nextInt(11)-5; int i=random.nextInt(11)-5; g.drawLine(x2+i, y2+j, x2+i, y2+j); } } else if(dp.str.equals("brush")){ x2=e.getX(); y2=e.getY(); for(i=-2;i<=2;i++){ g.drawLine(x1, y1+i, x2, y2+i); } for(i=-2;i<=2;i++){ g.drawLine(x1+i, y1, x2+i, y2); } x1=x2;y1=y2; } else if (dp.str.equals("eraser")){ g.setColor(Color.white); x2=e.getX(); y2=e.getY(); for(i=-5;i<=5;i++){ g.drawLine(x1, y1+i, x2, y2+i); } for(i=-5;i<=5;i++){ g.drawLine(x1+i, y1, x2+i, y2); } x1=x2;y1=y2; } else { //此段代码原本想实现结果预显功能的- -但失败了 /* x2=e.getX(); y2=e.getY(); if (dp.str.equals("Line")){ //if((x!=x2 || y!= y2) ){ g.setColor(Color.WHITE); g.drawLine(x1,y1,x,y); g.setColor(dp.getColor()); g.drawLine(x1,y1,x2,y2); x=x2;y=y2; } else if(dp.str.equals("Rect")){ if((x!=x2 || y!= y2) ){ g.setColor(Color.WHITE); g.drawRect(x1>=x? x:x1, y1>=y?y:y1, Math.abs(x1-x), Math.abs(y1-y)); g.setColor(dp.getColor()); } g.drawRect(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2)); x=x2;y=y2; } else if(dp.str.equals("Oval")){ g.setColor(Color.WHITE); g.drawOval(x1>=x? x:x1, y1>=y?y:y1, Math.abs(x1-x), Math.abs(y1-y)); g.setColor(dp.getColor()); g.drawOval(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2)); x=x2;y=y2; } else if(dp.str.equals("RoundRect")){ g.setColor(Color.WHITE); g.drawRoundRect(x1>=x? x:x1, y1>=y?y:y1, Math.abs(x1-x), Math.abs(y1-y),25,25); g.setColor(dp.getColor()); g.drawRoundRect(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2),25,25); x=x2;y=y2; } */ } } //记录鼠标释放 public void mouseReleased(MouseEvent e) { x2=e.getX(); y2=e.getY(); if(dp.str.equals("Polygon")){ //if(i==1&&j==0){ //j++; //x[j+1]=e.getX(); //y[j+1]=e.getY(); x2=e.getX(); y2=e.getY(); g.drawLine(x1, y1, x2, y2); if(x1==x2&& y1==y2) q++; x1=x2;y1=y2; //} } else { x2=e.getX(); y2=e.getY(); if (dp.str.equals("Line")){ g.drawLine(x1, y1, x2, y2); } else if(dp.str.equals("Rect")){ g.drawRect(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2)); } else if(dp.str.equals("Oval")){ g.drawOval(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2)); } else if(dp.str.equals("RoundRect")){ g.drawRoundRect(x1>=x2? x2:x1, y1>=y2?y2:y1, Math.abs(x1-x2), Math.abs(y1-y2),25,25); } } } private int q=0; @Override public void mouseClicked(MouseEvent e) { if(dp.str.equals("Polygon")){ x2=e.getX(); y2=e.getY(); g.drawLine(x1, y1, x2, y2); if(q==2) {g.drawLine(x0,y0,x2,y2);q=0;i=0;} } } @Override public void mouseExited(MouseEvent arg0) { // TODO Auto-generated method stub } @Override public void mouseMoved(MouseEvent arg0) { // TODO Auto-generated method stub } }