⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 paintbrush.java

📁 一个简单的画图板JAVA程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 * @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 + -