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

在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) {


}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值