📄 paintbrush.java
字号:
/**
* @author Groupmembers
* @version 1
* @since 1.4
* @see java.awt.*
** 这是一个简单的画图工具
*/
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;
/**
* @author 李佶
* @version 1.0 07-6-6
* @version 2.0 07-6-18
* @see PaintBrush 功能:用于实现画图板的所有功能
*/
public class PaintBrush extends JFrame {
//以下为参数定义,用于实现画图板的界面设置和各项功能
private Shape shape[] = new Shape[10000]; //定义画图的基本图形单元信息
private int num = 0; //用于记录基本图形单元的个数
private int undoStep[]= new int[100]; //用于记录撤销步骤
private int undoIndex=0;
private Container container; //界面控件容器
private JPanel toolPanel; //画图工具面板
private DrawPanel drawArea; //画图区域面板
private JMenu fileMenu,formatMenu,aboutMenu,fontMenu; //菜单栏:文件菜单,设置菜单,关于菜单,字体设置子菜单
private JMenuItem aboutItem,newItem,openItem,exitItem,saveItem,colorItem;
//菜单项,用于实现菜单的功能包括显示相关信息,新建文件,打开文件,保存文件和颜色选择
private JButton toolButton[]; //按纽数组
private static String buttonNames[] = { //按纽名,用于初始化按纽图片和设置按纽提示
"Pencil","Brush", "Line", "Oval", "fillOval","Rectangle", "fillRectangle",
"RoundRectangle", "fillRoundRectangle", "Polygon", "Eraser","Text" ,"Undo"
};
private int toolFlag = 0; //当前工具标记,初始化为铅笔
//工具对应表:
//0-铅笔 1-画刷 2-直线 3-椭圆 4-实心椭圆 5-矩形 6-实心矩形
//7-圆角矩形 8-实心圆角矩形 9-多边形 10-橡皮 11-文本 12-撤消
private Icon images[];
private float stroke = 1.0f; //画笔粗细设置,初始化为1.0F
private float eraserStroke = 1.0f; //橡皮大小设置,初始化为1.0F
private Icon sImages[],eImages[]; //画笔粗细选择图片组,橡皮大小选择图片组
private JList strokeList,eraserList; //用于实现线形粗细和橡皮大小选择的JList组件
private int xpoint[]=new int[20]; //点的横坐标,用于保存多边形的顶点横坐标
private int ypoint[]=new int[20]; //点的纵坐标,用于保存多边形的顶点纵坐标
private java.awt.Polygon polygon = new java.awt.Polygon();
private int length=0; //记录多边形边数,设初值为0
private JRadioButtonMenuItem fonts[]; //字体单项选择菜单
private JCheckBoxMenuItem styleItems[]; //字体风格多项选择菜单
private ButtonGroup fontGroup; //字体单项选择按钮组
private int style; //字体风格:加粗,斜体
private String font; //字体选择
private Color color = Color.BLACK; //颜色设置,初始化为黑色
private int R,G,B; //颜色的各项色彩值
private BufferedImage image,outImage;
private Graphics g;
/**
* @author 李佶
* @version 1.0 07-6-19
* @see Shape 功能:定义画图的基本单元信息
*/
class Shape implements Serializable{
int x1,y1,x2,y2; //x,y坐标值,用于定位
Color col; //当前颜色
float stroke; //画笔粗细值
float eraserStroke; //橡皮大小值
int sty; //字体风格(黑体,斜体)
String inS; //要插入的文本
String fon; //字体
int R,G,B; //色彩值
java.awt.Polygon polygon; //多边形
Shape() {
//Shape构造函数,处理绘制多边形对象
this.polygon = new java.awt.Polygon();
polygon.addPoint(0, 0);
}
void draw(Graphics2D g2d){}; //画图方法
}
/**
* author 李佶<br>
* version 1.0 07-6-2<br>
* author 李佶<br>
* version 2.0 07-6-2<br>
* 功能:用于实现画图程序的界面<br>
*/
public PaintBrush(){
super("PaintBrush");
/**
* 多边形点个数
*/
int m=0;
container = getContentPane();
container.setLayout(new BorderLayout());
//以下是各菜单项的实现
fileMenu = new JMenu("文件");/*文件菜单
包含新建,打开,保存,退出四个菜单项**/
newItem = new JMenuItem("新建"); //新建文件
/**
* author 吴权达<br>
* version 1.0 07-6-3<br>
* author 吴权达<br>
* version 2.0 07-6-21<br>
* 新建菜单项的事件监听实现<br>
*/
newItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event)
{
if (drawArea!=null)
{
image=null;
repaint();
}
else
{
drawArea = new DrawPanel();
drawArea.setBackground(Color.WHITE);//设置画图区域的颜色为白色
//区分了画图区域和工具栏的界限
container.add(drawArea,BorderLayout.CENTER); //将画图区域添加到容器中央
}
newFile(); //调用打开文件方法(初始化各对象)
setVisible(true);
}
});
openItem = new JMenuItem("打开"); //打开文件
/**
* author 吴权达<br>
* version 1.0 07-6-3<br>
* author 吴权达<br>
* version 2.0 07-6-21<br>
* 打开文件菜单项的事件监听实现<br>
*/
openItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
openFile(); //调用方法openFile,实现打开文件
}
});
saveItem = new JMenuItem("保存"); //保存文件
/**
* author 吴权达<br>
* version 1.0 07-6-3<br>
* author 吴权达<br>
* version 2.0 07-6-21<br>
* 保存文件菜单项的事件监听实现<br>
*/
saveItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event)
{
saveFile(); //调用方法saveFile实现当前文件保存
}
});
exitItem = new JMenuItem("退出"); //退出
/**
* author 李佶<br>
* version 1.0 07-6-3<br>
* author 李佶<br>
* version 2.0 07-6-21<br>
* 退出事件监听实现<br>
*/
exitItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
System.exit(0);
}
});
formatMenu = new JMenu("设置");/*设置菜单项
包括颜色设置和字体选择子菜单**/
colorItem = new JMenuItem("颜色");
/**
* author 宋飞<br>
* version 1.0 07-6-3<br>
* author 宋飞<br>
* version 2.0 07-6-21<br>
* 颜色事件监听实现<br>
*/
colorItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
chooseColor(); //调用选择颜色方法,实现颜色选择
}
});
ItemHandler itemHandler = new ItemHandler(); //类ItemHandler监听字体选择事件
String fontTip[] = {"Serif","Monospaced","SansSerif"}; //字体名字数组,储存各种字体的名称
fontMenu = new JMenu("字体");
fonts = new JRadioButtonMenuItem[fontTip.length];
fontGroup = new ButtonGroup();
for(int count = 0;count < fonts.length; count++){
//运用循环给字体单项选择项赋值,将其加入字体菜单项
//将它们加入fontGroup,建立起相互的逻辑关系并添加事件监听
fonts[count] = new JRadioButtonMenuItem(fontTip[count]);
fontMenu.add(fonts[count]);
fontGroup.add(fonts[count]);
fonts[count].addItemListener(itemHandler);
}
fonts[0].setSelected(true); //设置默认字体为Serif
fontMenu.addSeparator(); //加分隔线
String styleTip[] = {"黑体","斜体"}; //字体风格名数组
styleItems = new JCheckBoxMenuItem[styleTip.length];
styleHandler sHandler = new styleHandler(); //类styleHandler用于监听字体风格选择
for(int count = 0; count < styleTip.length; count++){
//运用for循环给多选字体风格项赋值
//并给各项添加事件监听器
styleItems[count] = new JCheckBoxMenuItem(styleTip[count]);
fontMenu.add(styleItems[count]);
styleItems[count].addItemListener(sHandler);
}
aboutMenu = new JMenu("关于"); //关于菜单项
aboutItem = new JMenuItem("关于画图板");
/**
* author 李佶<br>
* version 1.0 07-6-3<br>
* author 李佶<br>
* version 2.0 07-6-21<br>
* 关于菜单项的事件监听处理,显示画图板的相关信息<br>
*/
aboutItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent event){
JOptionPane.showMessageDialog(PaintBrush.this,"这是李佶,宋飞和吴权达编写的画图板程序,欢迎使用!",
"关于画图板",JOptionPane.INFORMATION_MESSAGE);
}
});
//以下把各菜单项添加到相应的菜单中
fileMenu.add(newItem);
fileMenu.add(openItem);
fileMenu.addSeparator();
fileMenu.add(saveItem);
fileMenu.add(exitItem);
formatMenu.add(colorItem);
formatMenu.addSeparator();
formatMenu.add(fontMenu);
aboutMenu.add(aboutItem);
//以下设置设置菜单工具条并加入以上的菜单
JMenuBar bar =new JMenuBar();
bar.add(fileMenu);
bar.add(formatMenu);
bar.add(aboutMenu);
setJMenuBar(bar);
toolPanel = new JPanel();
toolPanel.setBackground(Color.LIGHT_GRAY);
toolButton = new JButton[buttonNames.length];
images = new ImageIcon[buttonNames.length];
ButtonHandler bHandler = new ButtonHandler();
for(int i = 0; i < toolButton.length; i++)//用循环设置toolButton,添加图片。
{ //用循环设置工具按纽并给各按纽添加图片和事件监听器
//将按纽加入工具面板
images[i] = new ImageIcon(buttonNames[i] + ".gif");
toolButton[i] = new JButton(images[i]);
toolButton[i].setToolTipText(buttonNames[i]);
toolButton[i].addActionListener(bHandler);
toolPanel.add(toolButton[i]);
}
sImages = new ImageIcon[5]; ////设置线条粗细的图片组
sImages[0] = new ImageIcon("0.gif");
sImages[1] = new ImageIcon("1.gif");
sImages[2] = new ImageIcon("2.gif");
sImages[3] = new ImageIcon("3.gif");
sImages[4] = new ImageIcon("4.gif");
strokeList = new JList(sImages); //用列表实现线条粗细选择
strokeList.setVisibleRowCount(5);
strokeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); //设置为单选状态
/**
* author 宋飞<br>
* version 1.0 07-6-15<br>
* author 宋飞<br>
* version 2.0 07-6-15<br>
* 实现线条粗细选择的事件监听程序<br>
*/
strokeList.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent event){
int i = strokeList.getSelectedIndex();
switch(i){
case 0:
stroke = shape[num].stroke = 1.0f;
break;
case 1:
stroke = shape[num].stroke = 3.0f;
break;
case 2:
stroke = shape[num].stroke = 5.0f;
break;
case 3:
stroke = shape[num].stroke = 7.0f;
break;
case 4:
stroke = shape[num].stroke = 9.0f;
break;
}
}
});
eImages = new ImageIcon[3];
eImages[0] = new ImageIcon("e0.gif");
eImages[1] = new ImageIcon("e1.gif");
eImages[2] = new ImageIcon("e2.gif");
eraserList = new JList(eImages);
eraserList.setVisibleRowCount(3);
eraserList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
/**
* author 宋飞<br>
* version 1.0 07-6-15<br>
* author 宋飞<br>
* version 2.0 07-6-15<br>
* 实现橡皮选择的事件监听程序<br>
*/
eraserList.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent event){
int i = eraserList.getSelectedIndex();
switch(i){
case 0:
eraserStroke=shape[num].eraserStroke=1.0f;
break;
case 1:
eraserStroke=shape[num].eraserStroke=5.0f;
break;
case 2:
eraserStroke=shape[num].eraserStroke=10.0f;
break;
}
}
});
toolPanel.add(strokeList); //将线形选择列表加入工具面板
toolPanel.add(eraserList); //将橡皮大小选择列表加入工具面板
container.add(toolPanel,BorderLayout.NORTH); //添加工具面板到容器
drawShape(); //调用drawShape()方法
setSize(1000,700);
setVisible(true);
}//end PaintBrush constructor
/**
* @author 宋飞
* @version 1.0 07-6-15
* @version 2.0 07-6-18
* @see ButtonHandler功能:按纽事件监听的实现
*/
private class ButtonHandler implements ActionListener{
public void actionPerformed(ActionEvent event){
for(int count = 0;count<toolButton.length;count++){
if(event.getSource()==toolButton[count]){
toolFlag = count;
drawShape();
repaint();
}
}
}
}//end ButtonHandler
/**
* @author 吴权达
* @version 1.0 07-6-15
* @version 2.0 07-6-18
* @see ItemHandler功能:字体事件监听实现
*/
private class ItemHandler implements ItemListener{
public void itemStateChanged(ItemEvent e){
if(e.getSource()==fonts[0])
font="Serif";
else if(e.getSource()==fonts[1])
font="Monospaced";
else if(e.getSource()==fonts[2])
font="SansSerif";
}
}//ItemHandler
/**
* @author 吴权达
* @version 1.0 07-6-15
* @version 2.0 07-6-18
* @see styleHandler功能:字体风格监听实现
*/
private class styleHandler implements ItemListener{
private int valBold = Font.PLAIN;
private int valItalic=Font.PLAIN;
public void itemStateChanged(ItemEvent e){
if(e.getSource()==styleItems[0])
valBold = styleItems[0].isSelected()?Font.BOLD:Font.PLAIN;
if(e.getSource()==styleItems[1])
valItalic = styleItems[1].isSelected()?Font.ITALIC:Font.PLAIN;
style=valBold+valItalic;
}
}
/**
* author 吴权达<br>
* version 1.0 07-6-16<br>
* author 吴权达<br>
* version 2.0 07-6-20<br>
* 打开文件方法<br>
*/
public void openFile()
{
try
{
JFileChooser fileChooser=new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result =fileChooser.showOpenDialog(this);
if(result==JFileChooser.CANCEL_OPTION)
return ;
File fileName=fileChooser.getSelectedFile();
if (fileName==null||fileName.getName().equals(""))
JOptionPane.showMessageDialog(fileChooser,"Invalid File Name",
"Invalid File Name", JOptionPane.ERROR_MESSAGE);
else
{
if (drawArea!=null)
{
image=null;
repaint();
}
else
{
drawArea = new DrawPanel();
container.add(drawArea,BorderLayout.CENTER);
setVisible(true);
}
File file = new File( fileName.getAbsolutePath() );
image=ImageIO.read(file);
repaint();
}
}
catch(IOException e)
{
JOptionPane.showMessageDialog(this, e);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -