`
海王子1994
  • 浏览: 45406 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

论参数传递与简单画板的制作

阅读更多
   在Java中,参数传递分为两种类型,一种是值传递,另一种是引用传递,也称地址传递。
    值传递意即只传递数值方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。它适用于Java中的基本数据类型包括了String。
    引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。例子如下:(设已经创建了Student类)

                      String name = "柯南";

Student stu = new Student();//实例化对象
stu.setName(name);
int score = 100;


Student stu1 = new Student();
stu1.setName("小兰");

stu1 = stu;

stu.setName("哀");

stu1.study(5);
stu.study(score);
System.out.println("score  = "+score);
我们会发现输出的是:柯南在学习,得分为5分。
                    哀在学习,得分为100分。
                    score=100
可知引用传递适用于Java中的对象类型(类类型,引用类型),对象类型包括定义的类,接口,抽象类和数组。        

在了解了参数的传递后,我们来谈谈简单画板的制作: 
    首先,画板需要使用三个组件:JFrame,JPanel,JButton. 其次我们要分析简单画板的布局,知道要采用边框布局,创建两个面板,北边面板上放按钮;中间面板上供画画。
大概初步实现画板界面的步骤如下:
       1.定义一个A类,在类中定义主函数,在主函数中创建A类的对象调用初始化界面的方法
       2.在A中定义一个初始化界面的方法
       3.初始化界面的方法中,创建JFrame的对象,设置JFrame对象的属性值(布局)
      4.定义创建北边面板的方法,参数是JFrame对象。然后设置面板属性,再创建按钮,设置按钮大小,文本,将按钮添加到面板上。最后将北边面板添加到窗体的北边。
       5.定义创建中间面板的方法,参数是JFrame对象,设置属性
       6.将中间面板要添加到窗体的中间
接着要实现画板功能,我们就要安装事件监听器了。事件源有两个,所有的按钮和中间面板,分别用的事件监听器方法为
  addActionListener(ActionListener l);和addMouseListener(MouseListener l);
最后补充说下:Graphics Graphics提供了绘制图形的方法。
通过完成这些,我们便可实现画板上的所有图像,铅笔,刷子,橡皮擦,喷枪等各式各样的功能!怎样,心动了吧!那就自己动手做一个吧!!

我弄的简单画板制作代码如下,可供参考:


package preparation;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Draw {

/**
* @param args
*/


public static void main(String[] args) {
// TODO Auto-generated method stub
//实例化一个画板对象
       Draw sd=new Draw();
       //调用显示画板的方法
       sd.showUI();
}
    public void showUI()
    {
    /*
    * 实例化一个窗体对象
    */
    JFrame jf=new JFrame();
    jf.setTitle("普通画板");//设置窗体标题
    jf.setSize(600,500);//设置窗体大小
    jf.setLayout(new BorderLayout());//设置窗体布局为边框布局
    jf.setResizable(false);//禁止窗体改变大小
    jf.setLocationRelativeTo(null);//设置窗体居中
    jf.setDefaultCloseOperation(3);//设置关闭窗体关闭程序
   
   
   
    //调用创建北边面板方法
    JPanel northpanel=creatNorthPanel();
    //将面板添加到窗体上
    jf.add(northpanel,BorderLayout.NORTH);
   
    //调用创建中间面板方法
    JPanel centerpanel=creatCenterPanel();
    //将面板添加到窗体上
    jf.add(centerpanel,BorderLayout.CENTER);
   
       
    jf.setVisible(true);//设置窗体为可见     //  先让窗体可见,再弄下面的程序!!!!!!!!!!!!!!!!!!!!!!!!
   
    Graphics g=centerpanel.getGraphics();//从中间面板中接收Graphics对象
   
    DrawListener ml=new DrawListener(g,this);//实例化一个DrawListener类对象

    //给中间面板添加动作监听器,绑定MouseListener事情处理类对象
        centerpanel.addMouseListener(ml);
        //给中间面板添加动作监听器,绑定MouseMotionListener事件处理类对象
        centerpanel.addMouseMotionListener(ml);

   
    }
   
    private String str="Line";//定义一个存储图像的属性值
  /*
   * 获得存储图像的属性
   */
public String getStr()
{
return str;
}

    private Color color;//定义颜色的属性值
    /*
     * 获得颜色的属性
     */
    public Color getColor()
    {
    return color;
    }
    /*
     *  创建北边面板的方法
     */
    public JPanel creatNorthPanel()
    {   JPanel north_panel=new JPanel();//实例化北边面板的对象
        //设置北边面板的属性
        north_panel.setPreferredSize(new Dimension(500,100));//设置北边面板大小
        north_panel.setLayout(new FlowLayout(FlowLayout.LEFT));//设置北边面板布局为流式布局,并向左对齐
       
        //匿名实现类,实现ActionListener接口
        ActionListener al=new ActionListener()
        {
        //事情发生类方法
        public void actionPerformed(ActionEvent e)
        {  
        //判断是否点击到"Color"按钮
        if(e.getActionCommand().equals("Color"))
        {  //弹出一个颜色选择器,供选择颜色;选择好的颜色返回color
        color=JColorChooser.showDialog(null, "颜色选择器", Color.BLACK);[align=center][/align]
        }
        else
          {//获取按钮上的文本
        str=e.getActionCommand();//将获得的字符赋给字符串str
           
        }
        }
        };//注意加“;”!!!!!!!!!!!!!!!!!!
      
       
       //创建一位数组,储存按钮上的文本
        String []array={"Line","Rectangle","Oval","RoundRect","Polygon","Pencil","Color","Eraser","Brush","Gunjet"};
      
      // 遍历数组,创建按钮,并添加文本在按钮上
      
        for(int i=0;i<array.length;i++)
        {   
        JButton jb=new JButton(array[i]);//实例化按钮对象
        jb.setPreferredSize(new Dimension(100,40));//设置按钮大小
        //给事件源添加动作监听器方法,绑定事件处理类对象
        jb.addActionListener(al);
        north_panel.add(jb);//将按钮添加到北边面板上
        }
    return north_panel;
    }
    /*
     * 创建中间面板的方法
     */
    public JPanel creatCenterPanel()
    {  JPanel center_panel=new JPanel();//实例化中间面板的对象
        center_panel.setBackground(Color.WHITE);//设置面板的背景色
            return center_panel;
    }

}




package preparation;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;

public class DrawListener implements MouseListener ,MouseMotionListener {
private int x1,x2,y1,y2;//记录鼠标两次点击的坐标
    private Graphics g;//从界面对象上得到的画布对象
    private Graphics2D gg;
    private Draw sd;
    private int flag=1;
    public int m,n;
   
   
    //构造方法,用来接收Graphics对象和Draw类对象
    public DrawListener(Graphics g,Draw sd){
    this.g=g;
    this.sd=sd;
    }
    //鼠标按下的点的坐标
    public void mousePressed(MouseEvent e){
    //记录第一次点击的x,y:通过事件对象e得到的
    x1=e.getX();
    y1=e.getY();
    flag++;
    if(flag==2)
    {
    m=x1;
    n=y1;
    }
    //判断鼠标是按左键还是右键
    if(e.getButton()==1)
    {  //按左键,颜色为sd得到的黑色
    g.setColor(sd.getColor());
    }
    else if(e.getButton()==3)
    { //按右键,颜色为绿色
    g.setColor(Color.GREEN);
    }

    }
    //鼠标释放时的坐标
    public void mouseReleased(MouseEvent e)
    {
    //记录第二次点击时的坐标
    x2=e.getX();
    y2=e.getY();
   
    //判断是否为Line
    if(sd.getStr().equals("Line"))
    {

    //调用画布对象的方法,画直线
    g.drawLine(x1,y1,x2,y2);
    }
    /*
    * 判断是否为矩形Rectangle
    */
    if(sd.getStr().equals("Rectangle"))
    {
    g.drawRect(Math.min(x1, x2), Math.min(y1, y2),Math.abs(x1-x2), Math.abs(y1-y2));//Math.min(x1, x2), Math.min(y1, y2)!
    }
    /*
    * 判断是否为椭圆形Oval
    */
    if(sd.getStr().equals("Oval"))
    {
    g.drawOval(x1, y1,Math.abs(x1-x2) , Math.abs(y1-y2));
    }
    /*
    * 判断是否为RoundRect
    */
    if(sd.getStr().equals("RoundRect"))
    {
    g.drawRoundRect(x1, y1, Math.abs(x1-x2),Math.abs(y1-y2), Math.abs(x1-x2)/2,Math.abs(y1-y2)/2 );
    }
    }
    /*
     * 当鼠标在事件源上单击时按键执行的方法
     */
    public void mouseClicked(MouseEvent e)
    {   //获取点击过程中的坐标值
int x = e.getX();
int y = e.getY();

    if(sd.getStr().equals("Polygon"))
    {
      g.drawLine(x, y, m, n);
    }
    }
    public void mouseEntered(MouseEvent e)
    {}
    public void mouseExited(MouseEvent e)
    {}
/*
* 当鼠标在事件源上拖拉时按键执行的方法
*/
public void mouseDragged(MouseEvent e) {
//判断点击的按钮是否为"Pencil"
if(sd.getStr().equals("Pencil"))
{
//获取x,y的坐标值
int x=e.getX();
int y=e.getY();
//画线
g.drawLine(x1, y1, x, y);
//赋值
x1=x;
y1=y;

}
//判读点击的按钮是否为"Eraser"
if(sd.getStr().equals("Eraser"))
{
//获取x,y的坐标值
int x=e.getX();
int y=e.getY();
//设置线条为白色
   g.setColor(Color.WHITE);
//画线
   gg =(Graphics2D)g; //实例化一个Graphics2D对象
   //设置笔的粗细为2.0F,线条端点是CAP_ROUND,点划线模式为 JOIN_ROUND 
       gg.setStroke(new   BasicStroke(10.0F,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));  
   gg.drawLine(x1,y1,x,y);  
       gg.setStroke(new   BasicStroke());  
//赋值
x1=x;
y1=y;

}

//判读点击的按钮是否为"Brush"
if(sd.getStr().equals("Brush"))
{
//获取x,y的坐标值
int x=e.getX();
int y=e.getY();
//设置线条为黑色
  g.setColor(Color.BLACK);
            /*
                      *画线
                      */

gg =(Graphics2D)g; //实例化一个Graphics2D对象
       //设置笔的粗细为2.0F,线条端点是CAP_ROUND,点划线模式为 JOIN_ROUND 
gg.setStroke(new   BasicStroke(10.0F,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));  
     gg.drawLine(x1,y1,x,y);  
        gg.setStroke(new   BasicStroke());  
//赋值
x1=x;
y1=y;

     }
//判读点击的按钮是否为"Gunjet"
if(sd.getStr().equals("Gunjet"))
{

           //获取x,y的坐标值
   int x=e.getX();
  int y=e.getY();
   int x0=0;             int y0=0;
//设置线条为黑色
   g.setColor(Color.BLACK);
//噴槍大小
int size=8;                //噴槍点數
int count=10;
for(int i=0;i<count;i++)
{  x0 = new Random().nextInt(size)+ 1;
y0 = new Random().nextInt(size) + 1;
g.fillRect(x+x0, y+y0,5,5);
}
}

/*
    * 判断是否为Polygon
    */
    //获取拖动过程中的坐标值
int x = e.getX();
int y = e.getY();



    if(sd.getStr().equals("Polygon"))
    {
    //判断鼠标点击的坐标是不是与第一次点击的一样,不同则画线
    if((x!=m)||(y!=n))
    {
    //画线
    g.drawLine(x1, y1, x, y);
    //赋值
    x1=x;
    y1=y;
    }
   
   
      
    }
}
/*
* 事件源上移动鼠标的方法
*/
public void mouseMoved(MouseEvent e) {


}
   
   
}
分享到:
评论

相关推荐

    易语言画板打印与打印机打印例子源码

    字体参数,(可传递自定义字体,也可以直接传递控件的字体。)。 二.打印机打印的各个方法,相当于模块化的打印过程,按打印的内容顺序进行编写,按过程打印(打印机控件暴露出不支持打印总页数的问题)。 三.写完...

    易语言在画板中写出指定文本当画板中已满会自动滚屏

    在易语言中,实现画板中的文本滚动显示是一项常见的需求,特别是在制作日志窗口、聊天室或者数据显示界面时。今天我们将探讨如何在易语言中实现在画板中写出指定文本,并在画板内容满溢时自动滚屏。 首先,我们要...

    ScreenToGif.rar

    在日常工作中,无论是制作教程、演示操作过程还是记录有趣瞬间,ScreenToGif都是一个理想的解决方案。 GIF图像是一种常见的网络图像格式,以其小巧的体积和循环播放的特点广泛应用于社交媒体、博客和论坛。通过...

    allegro 16.3快速教学进阶教程

    生成网表是将原理图转换为PCB设计的关键步骤之一,用于将电路逻辑信息传递给PCB设计工具。 **关键步骤:** 1. **检查原理图:** 使用`Design Rules Check`工具检查电路图的正确性。 2. **生成网表:** 通过`Create ...

    java jdk实列宝典 光盘源代码

    java的参数传递;自定义形状类;类的加载顺序;方法和变量在继承时的覆盖和隐藏;排序类; 3数字 数字类;格式化数字;转换数字进制;生成随机数; 4数组和集合 使用Arrays类;动态调整数组长度;java为数据结构中的...

    在HTML画布上绘图

    3. **合并用户配置**:使用jQuery的`extend`方法将用户传递的参数与默认选项合并,`options = $.extend({}, defaults, options);`。 4. **初始化插件**:在插件内部获取canvas元素,创建绘图所需的对象,如画笔`var...

    《程序天下:JavaScript实例自学手册》光盘源码

    1.25 使用JavaScript传递页面参数 1.26 页面被冻结 第 2章 按钮特效 2.1 页面刷新按钮 2.2 按回车调用登录按钮 2.3 动态创建按钮 2.3 平面按钮 2.4 按钮的嵌入效果 2.5 按钮改变状态栏信息 2.6 定义按钮的热键 2.7 ...

    程序天下:JavaScript实例自学手册

    1.25 使用JavaScript传递页面参数 1.26 页面被冻结 第 2章 按钮特效 2.1 页面刷新按钮 2.2 按回车调用登录按钮 2.3 动态创建按钮 2.3 平面按钮 2.4 按钮的嵌入效果 2.5 按钮改变状态栏信息 2.6 定义按钮的热键 2.7 ...

    易语言程序免安装版下载

    操作系统界面功能支持库(shell.fne)中的“执行()”命令增加一个参数“窗口显示方式”,作用与核心库“运行()”命令的同名参数一致。 6. 数据库操作支持库增加读写长整数字段的功能,但受限于系统接口暂不能读写...

Global site tag (gtag.js) - Google Analytics