📄 drawpad.java
字号:
package DrawPad; //生成类包
//引入所需java包
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class DrawPad extends JFrame//定义画板主类
{
private ObjectInputStream input;
private ObjectOutputStream output; //定义输入输出流,用来调用和保存图像文件//
private int currentChoice=0; //设置默认画图状态为随笔画
int index=0; //当前已经绘制的图形数目
private Color color=Color.black; //当前画笔默颜色默认为黑色
int R,G,B; //存放当前颜色值
private int stroke=1; //当前笔画粗细默认为1
private DrawPanel drawingArea; //定义画图区域
private int width=800,height=600; //定义画图区域初始大小
drawings[] itemList=new drawings[5000];//用来存放基本图形数目的数组
JMenuItem shapesItem[]; //定义基本绘图菜单按钮数组
private JLabel statusBar; //显示鼠标状态的提示条
private String shapeNames[]={
/*画图板上面有的基本的几个绘图单元菜单按钮*/
"Pencil", //铅笔画,也就是用鼠标拖动着随意绘图
"Line", //绘制直线
"Rect", //绘制空心矩形
"fRect", //绘制以指定颜色填充的实心矩形
"Square", //绘制空心正方形
"fSquare", //绘制实心正方形
"Oval", //绘制空心椭圆
"fOval", //绘制以指定颜色填充的实心椭圆
"Circle", //绘制圆形
"fCircle", //绘制以指定颜色填充的实心圆形
"RoundRect", //绘制空心圆角矩形
"frRect", //绘制以指定颜色填充的实心圆角矩形
"Triangle", //绘制空心直角三角形
"Rubber", //橡皮擦,可用来擦去已经绘制好的图案
};
public DrawPad() //构造函数初始化主类
{
super("DrawPad");
ButtonHandler handler=new ButtonHandler();
JMenuBar menuBar = new JMenuBar();//主菜单条
JMenu fileMenu = new JMenu("File");//File菜单条
fileMenu.setMnemonic('F');
JMenu shapesMenu = new JMenu("Shapes");//绘图菜单条
shapesMenu.setMnemonic('S');
JMenu colorMenu = new JMenu("Color");//选择颜色菜单条
colorMenu.setMnemonic('C');
JMenu strokeMenu=new JMenu("Stroke");//选择线条粗细
strokeMenu.setMnemonic('T');
//新建文件选项
JMenuItem newItem = new JMenuItem("New");//
newItem.setMnemonic('N');
newItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
newFile(); //如果被触发,则调用新建文件函数段
}
}
);
fileMenu.add(newItem);
//Open文件选项
JMenuItem openItem = new JMenuItem("Open");
openItem.setMnemonic('O');
openItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
loadFile(); //如果被触发,则调用打开文件函数段
}
}
);
fileMenu.add(openItem);
//Save文件选项
JMenuItem saveItem = new JMenuItem("Save");
saveItem.setMnemonic('S');
saveItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
saveFile(); //如果被触发,则调用保存文件函数段
}
}
);
fileMenu.add(saveItem);
fileMenu.addSeparator();//save and exit 菜单按钮之间间隔
//Exit绘图选项
JMenuItem exitItem = new JMenuItem("Exit");
exitItem.setMnemonic('X');
exitItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
System.exit(0); //如果被触发,则退出画图板程序
}
}
);
fileMenu.add(exitItem);
menuBar.add(fileMenu);
//color选项
JMenuItem colorItem = new JMenuItem("Choose Color");
colorItem.setMnemonic('o');
colorItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
chooseColor(); //如果被触发,则调用选择颜色函数段
}
}
);
colorMenu.add(colorItem);
menuBar.add(colorMenu);
//stroke选项
JMenuItem strokeItem = new JMenuItem("Set Stroke");
strokeItem.setMnemonic('k');
strokeItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{ setStroke(); }
}
);
strokeMenu.add(strokeItem);
menuBar.add(strokeMenu);
//创建各种图形得按钮
shapesItem=new JMenuItem[shapeNames.length];
char mnem[]={'P','L','R','f','S','f','O','f','C','f','R','f','T','R'};
for(int j=0;j<shapesItem.length;j++){
shapesItem[j]=new JMenuItem(shapeNames[j]);
shapesItem[j].setMnemonic(mnem[j]);
shapesMenu.add(shapesItem[j]);
if(j%2==1){//每两个按钮,添加分隔符
shapesMenu.addSeparator();
}
}
menuBar.add(shapesMenu);
//将动作侦听器加入按钮里面
for(int i=0;i<shapesItem.length;i++){
shapesItem[i].addActionListener(handler);
}
//帮助菜单
JMenu helpMenu = new JMenu("Help");
helpMenu.setMnemonic('H');
JMenuItem aboutItem = new JMenuItem("About this Drawing Pad!");
aboutItem.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(null,
"This is a small drawing pad!\nCopyright (c) 2006 SoftwareEngineering ",
" 画图板程序说明 ",
JOptionPane.INFORMATION_MESSAGE );
}
}
);
helpMenu.add(aboutItem);
menuBar.add(helpMenu);
//创建绘画区
drawingArea=new DrawPanel();
Container c=getContentPane();
super.setJMenuBar( menuBar ); //菜单工作区
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);
setVisible(true);
}
//按钮侦听器ButtonHanler类,内部类,用来侦听基本按钮的操作
public class ButtonHandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
for(int j=0;j<shapesItem.length;j++)
{
if(e.getSource()==shapesItem[j])
{currentChoice=j;
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==0||currentChoice==13){
itemList[index].x1=itemList[index].x2=e.getX();
itemList[index].y1=itemList[index].y2=e.getY();
index++;
createNewItem();
}
}
public void mouseReleased(MouseEvent e)
{statusBar.setText(" Mouse Released @:[" + e.getX() +
", " + e.getY() + "]");
if(currentChoice==0||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==0||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() + "]");}
}
//画图面板类,用来画图
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 0:
itemList[index]=new Pencil();
break;
case 1:
itemList[index]=new Line();
break;
case 2:
itemList[index]=new Rect();
break;
case 3:
itemList[index]=new fillRect();
break;
case 4:
itemList[index]=new Square();
break;
case 5:
itemList[index]=new fillSquare();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -