复习一下J2ME,一个画图程序的源码

package drawingpanel;

import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;


public class MiniDrawPad extends JFrame //主类,扩展了JFrame类,用来生成主界面
{
private ObjectInputStream input;
private ObjectOutputStream output; //定义输入输出流,用来调用和保存图像文件

private JButton choices[]; //按钮数组,存放以下名称的功能按钮

private String names[]={
"New",
"Open",
"Save", //这三个是基本操作按钮,包括"新建"、"打开"、"保存"

/*接下来是我们的画图板上面有的基本的几个绘图单元按钮*/

"Pencil", //铅笔画,也就是用鼠标拖动着随意绘图
"Line", //绘制直线
"Rect", //绘制空心矩形
"fRect", //绘制以指定颜色填充的实心矩形
"Oval", //绘制空心椭圆
"fOval", //绘制以指定颜色填充的实心椭圆
"Circle", //绘制圆形
"fCircle", //绘制以指定颜色填充的实心圆形
"RoundRect", //绘制空心圆角矩形
"frRect", //绘制以指定颜色填充的实心圆角矩形
"Rubber", //橡皮擦,可用来擦去已经绘制好的图案
"Color", //选择颜色按钮,可用来选择需要的颜色
"Stroke", //选择线条粗细的按钮,输入需要的数值可以实现绘图线条粗细的变化
"Word" //输入文字按钮,可以在绘图板上实现文字输入
};

private String styleNames[]={
" 宋体 " , " 隶书 " , " 华文彩云 " , " 仿宋_GB2312 " , " 华文行楷 " ,
" 方正舒体 " , " Times New Roman " , " Serif " , " Monospaced " ,
" SonsSerif " , " Garamond "
}; //可供选择的字体项
//当然这里的灵活的结构可以让读者自己随意添加系统支持的字体

private Icon items[];

private String tipText[]={
//这里是鼠标移动到相应按钮上面上停留时给出的提示说明条
//读者可以参照上面的按钮定义对照着理解
"Draw a new picture",
"Open a saved picture",
"Save current drawing",
"Draw at will",
"Draw a straight line",
"Draw a rectangle",
"Fill a ractangle",
"Draw an oval",
"Fill an oval",
"Draw a circle",
"Fill a circle",
"Draw a round rectangle",
"Fill a round rectangle",
"Erase at will",
"Choose current drawing color",
"Set current drawing stroke",
"Write down what u want"
};

JToolBar buttonPanel ; //定义按钮面板
private JLabel statusBar; //显示鼠标状态的提示条

private DrawPanel drawingArea; //画图区域
private int width=800,height=550; //定义画图区域初始大小

drawings[] itemList=new drawings[5000]; //用来存放基本图形的数组
private int currentChoice=3; //设置默认画图状态为随笔画
int index=0; //当前已经绘制的图形数目
private Color color=Color.black; //当前画笔颜色
int R,G,B; //用来存放当前色彩值

int f1,f2; //用来存放当前字体风格
String style1; //用来存放当前字体
private float stroke=1.0f; //设置画笔粗细,默认值为1.0f

JCheckBox bold,italic; //定义字体风格选择框
//bold为粗体,italic为斜体,二者可以同时使用
JComboBox styles;

public MiniDrawPad() //构造函数
{
super("Drawing Pad");
JMenuBar bar=new JMenuBar(); //定义菜单条
JMenu fileMenu=new JMenu("File");
fileMenu.setMnemonic('F');

//新建文件菜单条
JMenuItem newItem=new JMenuItem("New");
newItem.setMnemonic('N');
newItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
newFile(); //如果被触发,则调用新建文件函数段
}
}
);
fileMenu.add(newItem);

//保存文件菜单项
JMenuItem saveItem=new JMenuItem("Save");
saveItem.setMnemonic('S');
saveItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
saveFile(); //如果被触发,则调用保存文件函数段
}
}
);
fileMenu.add(saveItem);

//打开文件菜单项
JMenuItem loadItem=new JMenuItem("Load");
loadItem.setMnemonic('L');
loadItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
loadFile(); //如果被触发,则调用打开文件函数段
}
}
);
fileMenu.add(loadItem);

fileMenu.addSeparator();

//退出菜单项
JMenuItem exitItem=new JMenuItem("Exit");
exitItem.setMnemonic('X');
exitItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
System.exit(0); //如果被触发,则退出画图板程序
}
}
);
fileMenu.add(exitItem);
bar.add(fileMenu);

//设置颜色菜单条
JMenu colorMenu=new JMenu("Color");
colorMenu.setMnemonic('C');

//选择颜色菜单项
JMenuItem colorItem=new JMenuItem("Choose Color");
colorItem.setMnemonic('O');
colorItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
chooseColor(); //如果被触发,则调用选择颜色函数段
}
}
);
colorMenu.add(colorItem);
bar.add(colorMenu);

//设置线条粗细菜单条
JMenu strokeMenu=new JMenu("Stroke");
strokeMenu.setMnemonic('S');

//设置线条粗细菜单项
JMenuItem strokeItem=new JMenuItem("Set Stroke");
strokeItem.setMnemonic('K');
strokeItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
setStroke();
}
}
);
strokeMenu.add(strokeItem);
bar.add(strokeMenu);

//设置提示菜单条
JMenu helpMenu=new JMenu("Help");
helpMenu.setMnemonic('H');

//设置提示菜单项
JMenuItem aboutItem=new JMenuItem("About this Drawing Pad!");
aboutItem.setMnemonic('A');
aboutItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(null,
"This is a mini drawing pad!\nCopyright (c) 2002 Tsinghua University ",
" 画图板程序说明 ",
JOptionPane.INFORMATION_MESSAGE );
}
}
);
helpMenu.add(aboutItem);
bar.add(helpMenu);

items=new ImageIcon[names.length];

//创建各种基本图形的按钮
drawingArea=new DrawPanel();
choices=new JButton[names.length];
buttonPanel = new JToolBar( JToolBar.VERTICAL ) ;
buttonPanel = new JToolBar( JToolBar.HORIZONTAL) ;
ButtonHandler handler=new ButtonHandler();
ButtonHandler1 handler1=new ButtonHandler1();

//导入我们需要的图形图标,这些图标都存放在与源文件相同的目录下面
for(int i=0;i<choices.length;i++)
{//items[i]=new ImageIcon( MiniDrawPad.class.getResource(names[i] +".gif"));
//如果在jbuilder下运行本程序,则应该用这条语句导入图片
items[i]=new ImageIcon(names[i] + ".gif");
//默认的在jdk或者jcreator下运行,用此语句导入图片
choices[i]=new JButton("",items[i]);
choices[i].setToolTipText(tipText[i]);
buttonPanel.add(choices[i]);
}

//将动作侦听器加入按钮里面
for(int i=3;i<choices.length-3;i++)
{
choices[i].addActionListener(handler);
}

choices[0].addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
newFile();
}
}
);

choices[1].addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
loadFile();
}
}
);

choices[2].addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
saveFile();
}
}
);
choices[choices.length-3].addActionListener(handler1);
choices[choices.length-2].addActionListener(handler1);
choices[choices.length-1].addActionListener(handler1);

//字体风格选择
styles=new JComboBox(styleNames);
styles.setMaximumRowCount(8);
styles.addItemListener(
new ItemListener(){
public void itemStateChanged(ItemEvent e)
{
style1=styleNames[styles.getSelectedIndex()];
}
}
);
//字体选择
bold=new JCheckBox("BOLD");
italic=new JCheckBox("ITALIC");

checkBoxHandler cHandler=new checkBoxHandler();
bold.addItemListener(cHandler);
italic.addItemListener(cHandler);

JPanel wordPanel=new JPanel();
buttonPanel.add(bold);
buttonPanel.add(italic);
buttonPanel.add(styles);
styles.setMinimumSize( new Dimension ( 50, 20 ) );
styles.setMaximumSize(new Dimension ( 100, 20 ) );

Container c=getContentPane();
super.setJMenuBar( bar );
c.add(buttonPanel,BorderLayout.NORTH);
c.add(drawingArea,BorderLayout.CENTER);

statusBar=new JLabel();
c.add(statusBar,BorderLayout.SOUTH);
statusBar.setText(" Welcome To The Little Drawing Pad!!! :)");

createNewItem();
setSize(width,height);

show();
}


//按钮侦听器ButtonHanler类,内部类,用来侦听基本按钮的操作
public class ButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
for(int j=3;j<choices.length-3;j++)
{
if(e.getSource()==choices[j])
{currentChoice=j;
createNewItem();
repaint();}
}
}
}

//按钮侦听器ButtonHanler1类,用来侦听颜色选择、画笔粗细设置、文字输入按钮的操作
public class ButtonHandler1 implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==choices[choices.length-3])
{chooseColor();}
if(e.getSource()==choices[choices.length-2])
{setStroke();}
if(e.getSource()==choices[choices.length-1])
{JOptionPane.showMessageDialog(null,
"Please hit the drawing pad to choose the word input position",
"Hint",JOptionPane.INFORMATION_MESSAGE );
currentChoice=14;
createNewItem();
repaint();
}
}
}


//鼠标事件mouseA类,继承了MouseAdapter,用来完成鼠标相应事件操作
class mouseA extends MouseAdapter
{
public void mousePressed(MouseEvent e)
{statusBar.setText(" Mouse Pressed @:[" + e.getX() +
", " + e.getY() + "]");//设置状态提示

itemList[index].x1=itemList[index].x2=e.getX();
itemList[index].y1=itemList[index].y2=e.getY();

//如果当前选择的图形是随笔画或者橡皮擦,则进行下面的操作
if(currentChoice==3||currentChoice==13)
{
itemList[index].x1=itemList[index].x2=e.getX();
itemList[index].y1=itemList[index].y2=e.getY();
index++;
createNewItem();
}

//如果当前选择的图形式文字输入,则进行下面操作
if(currentChoice==14)
{
itemList[index].x1=e.getX();
itemList[index].y1=e.getY();

String input;
input=JOptionPane.showInputDialog(
"Please input the text you want!");
itemList[index].s1=input;
itemList[index].x2=f1;
itemList[index].y2=f2;
itemList[index].s2=style1;

index++;
currentChoice=14;
createNewItem();
drawingArea.repaint();
}
}

public void mouseReleased(MouseEvent e)
{statusBar.setText(" Mouse Released @:[" + e.getX() +
", " + e.getY() + "]");

if(currentChoice==3||currentChoice==13)
{
itemList[index].x1=e.getX();
itemList[index].y1=e.getY();
}
itemList[index].x2=e.getX();
itemList[index].y2=e.getY();
repaint();
index++;
createNewItem();
}

public void mouseEntered(MouseEvent e)
{
statusBar.setText(" Mouse Entered @:[" + e.getX() +
", " + e.getY() + "]");
}

public void mouseExited(MouseEvent e)
{
statusBar.setText(" Mouse Exited @:[" + e.getX() +
", " + e.getY() + "]");
}
}


//鼠标事件mouseB类继承了MouseMotionAdapter,用来完成鼠标拖动和鼠标移动时的相应操作
class mouseB extends MouseMotionAdapter
{
public void mouseDragged(MouseEvent e)
{statusBar.setText(" Mouse Dragged @:[" + e.getX() +
", " + e.getY() + "]");

if(currentChoice==3||currentChoice==13)
{
itemList[index-1].x1=itemList[index].x2=itemList[index].x1=e.getX();
itemList[index-1].y1=itemList[index].y2=itemList[index].y1=e.getY();
index++;
createNewItem();
}
else
{
itemList[index].x2=e.getX();
itemList[index].y2=e.getY();
}
repaint();
}

public void mouseMoved(MouseEvent e)
{statusBar.setText(" Mouse Moved @:[" + e.getX() +
", " + e.getY() + "]");}
}


//选择字体风格时候用到的事件侦听器类,加入到字体风格的选择框中
private class checkBoxHandler implements ItemListener
{
public void itemStateChanged(ItemEvent e)
{
if(e.getSource()==bold)
if(e.getStateChange()==ItemEvent.SELECTED)
f1=Font.BOLD;
else
f1=Font.PLAIN;
if(e.getSource()==italic)
if(e.getStateChange()==ItemEvent.SELECTED)
f2=Font.ITALIC;
else
f2=Font.PLAIN;
}
}


//画图面板类,用来画图
class DrawPanel extends JPanel
{
public DrawPanel()
{
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
setBackground(Color.white);
addMouseListener(new mouseA());
addMouseMotionListener(new mouseB());
}

public void paintComponent(Graphics g)
{
super.paintComponent(g);

Graphics2D g2d=(Graphics2D)g; //定义画笔

int j=0;
while (j<=index)
{
draw(g2d,itemList[j]);
j++;
}
}

void draw(Graphics2D g2d,drawings i)
{
i.draw(g2d);//将画笔传入到各个子类中,用来完成各自的绘图
}
}


//新建一个画图基本单元对象的程序段
void createNewItem()
{ if(currentChoice==14)//进行相应的游标设置
drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
else
drawingArea.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));

switch (currentChoice)
{
case 3:
itemList[index]=new Pencil();
break;
case 4:
itemList[index]=new Line();
break;
case 5:
itemList[index]=new Rect();
break;
case 6:
itemList[index]=new fillRect();
break;
case 7:
itemList[index]=new Oval();
break;
case 8:
itemList[index]=new fillOval();
break;
case 9:
itemList[index]=new Circle();
break;
case 10:
itemList[index]=new fillCircle();
break;
case 11:
itemList[index]=new RoundRect();
break;
case 12:
itemList[index]=new fillRoundRect();
break;
case 13:
itemList[index]=new Rubber();
break;
case 14:
itemList[index]=new Word();
break;
}
itemList[index].type=currentChoice;
itemList[index].R=R;
itemList[index].G=G;
itemList[index].B=B;
itemList[index].stroke=stroke;
}


//选择当前颜色程序段
public void chooseColor()
{
color=JColorChooser.showDialog(MiniDrawPad.this,
"Choose a color",color);
R=color.getRed();
G=color.getGreen();
B=color.getBlue();
itemList[index].R=R;
itemList[index].G=G;
itemList[index].B=B;
}

//选择当前线条粗细程序段
public void setStroke()
{
String input;
input=JOptionPane.showInputDialog(
"Please input a float stroke value! ( >0 )");
stroke=Float.parseFloat(input);
itemList[index].stroke=stroke;
}

//保存图形文件程序段
public void saveFile()
{
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result =fileChooser.showSaveDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
return ;
File fileName=fileChooser.getSelectedFile();
fileName.canWrite();

if (fileName==null||fileName.getName().equals(""))
JOptionPane.showMessageDialog(fileChooser,"Invalid File Name",
"Invalid File Name", JOptionPane.ERROR_MESSAGE);
else{
try {
fileName.delete();
FileOutputStream fos=new FileOutputStream(fileName);

output=new ObjectOutputStream(fos);
drawings record;

output.writeInt( index );

for(int i=0;i< index ;i++)
{
drawings p= itemList[ i ] ;
output.writeObject(p);
output.flush(); //将所有图形信息强制转换成父类线性化存储到文件中
}
output.close();
fos.close();
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}
}

//打开一个图形文件程序段
public void loadFile()
{

JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result =fileChooser.showOpenDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
return ;
File fileName=fileChooser.getSelectedFile();
fileName.canRead();
if (fileName==null||fileName.getName().equals(""))
JOptionPane.showMessageDialog(fileChooser,"Invalid File Name",
"Invalid File Name", JOptionPane.ERROR_MESSAGE);
else {
try {

FileInputStream fis=new FileInputStream(fileName);

input=new ObjectInputStream(fis);
drawings inputRecord;

int countNumber=0;
countNumber=input.readInt();

for(index=0;index< countNumber ;index++)
{
inputRecord=(drawings)input.readObject();
itemList[ index ] = inputRecord ;

}

createNewItem();
input.close();

repaint();
}
catch(EOFException endofFileException){
JOptionPane.showMessageDialog(this,"no more record in file",
"class not found",JOptionPane.ERROR_MESSAGE );
}
catch(ClassNotFoundException classNotFoundException){
JOptionPane.showMessageDialog(this,"Unable to Create Object",
"end of file",JOptionPane.ERROR_MESSAGE );
}
catch (IOException ioException){
JOptionPane.showMessageDialog(this,"error during read from file",
"read Error",JOptionPane.ERROR_MESSAGE );
}
}
}


//新建一个文件程序段
public void newFile()
{
index=0;
currentChoice=3;
color=Color.black;
stroke=1.0f;
createNewItem();
repaint();//将有关值设置为初始状态,并且重画
}


//主函数段
public static void main(String args[])
{try {
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName());
}
catch ( Exception e ) {}//将界面设置为当前windows风格

MiniDrawPad newPad=new MiniDrawPad();
newPad.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e)
{System.exit(0);}});
}
}


//定义画图的基本图形单元
class drawings implements Serializable//父类,基本图形单元,用到串行化接口,保存时所用
{
int x1,y1,x2,y2; //定义坐标属性
int R,G,B; //定义色彩属性
float stroke; //定义线条粗细属性
int type; //定义字体属性
String s1;
String s2; //定义字体风格属性

void draw(Graphics2D g2d){};//定义绘图函数
}


/*******************************************************************************
下面是各种基本图形单元的子类,都继承自父类drawings,请仔细理解继承的概念
********************************************************************************/

class Line extends drawings //直线类
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke,
BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL));
g2d.drawLine(x1,y1,x2,y2);
}
}


class Rect extends drawings//矩形类
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke));
g2d.drawRect(Math.min(x1,x2),Math.min(y1,y2),
Math.abs(x1-x2),Math.abs(y1-y2));
}
}


class fillRect extends drawings//实心矩形类
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke));
g2d.fillRect(Math.min(x1,x2),Math.min(y1,y2),
Math.abs(x1-x2),Math.abs(y1-y2));
}
}


class Oval extends drawings//椭圆类
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke));
g2d.drawOval(Math.min(x1,x2),Math.min(y1,y2),
Math.abs(x1-x2),Math.abs(y1-y2));
}
}


class fillOval extends drawings//实心椭圆
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke));
g2d.fillOval(Math.min(x1,x2),Math.min(y1,y2),
Math.abs(x1-x2),Math.abs(y1-y2));
}
}


class Circle extends drawings//圆类
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke));
g2d.drawOval(Math.min(x1,x2),Math.min(y1,y2),
Math.max(Math.abs(x1-x2),Math.abs(y1-y2)),
Math.max(Math.abs(x1-x2),Math.abs(y1-y2))
);
}
}


class fillCircle extends drawings//实心圆
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke));
g2d.fillOval(Math.min(x1,x2),Math.min(y1,y2),
Math.max(Math.abs(x1-x2),Math.abs(y1-y2)),
Math.max(Math.abs(x1-x2),Math.abs(y1-y2))
);
}
}


class RoundRect extends drawings//圆角矩形类
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke));
g2d.drawRoundRect(Math.min(x1,x2),Math.min(y1,y2),
Math.abs(x1-x2),Math.abs(y1-y2),
50,35);
}
}


class fillRoundRect extends drawings//实心圆角矩形类
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke));
g2d.fillRoundRect(Math.min(x1,x2),Math.min(y1,y2),
Math.abs(x1-x2),Math.abs(y1-y2),
50,35);
}
}


class Pencil extends drawings//随笔画类
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(R,G,B));
g2d.setStroke(new BasicStroke(stroke,
BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL));
g2d.drawLine(x1,y1,x2,y2);
}
}


class Rubber extends drawings//橡皮擦类
{
void draw(Graphics2D g2d)
{g2d.setPaint(new Color(255,255,255));
g2d.setStroke(new BasicStroke(stroke+4,
BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL));
g2d.drawLine(x1,y1,x2,y2);
}
}


class Word extends drawings//输入文字类
{
void draw(Graphics2D g2d)
{
g2d.setPaint(new Color(R,G,B));
g2d.setFont(new Font(s2,x2+y2,((int)stroke)*18));
if (s1!= null )
g2d.drawString(s1,x1,y1);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值