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

📄 javapainter.java

📁 一个画图程序代码
💻 JAVA
字号:
//JavaPainter.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;

public class JavaPainter extends JFrame
{
	JToggleButton shapeBtn[]=new JToggleButton[3];
	JavaPaintPanel jpp=new JavaPaintPanel();
	
	MenuItem menuItemOpen,menuItemSave,menuItemBack,menuItemClear;   
  MenuBar menuBarX;
  
  FileDialog openDlg, saveDlg;

	public JavaPainter()
	{
		super("Java Painter");
		MenuClickListener menuClickListener =new MenuClickListener();//菜单
		menuBarX=new MenuBar(); 
    Menu menuItemFile=new Menu("文件"); 
    menuBarX.add(menuItemFile); 
    Menu menuItemEdit=new Menu("编辑"); 
    menuBarX.add(menuItemEdit); 

    menuItemOpen=new MenuItem("打开"); 
    menuItemOpen.addActionListener(menuClickListener); 
    menuItemSave=new MenuItem("保存"); 
    menuItemSave.addActionListener(menuClickListener); 
    menuItemFile.add(menuItemOpen);
    menuItemFile.add(menuItemSave);
    menuItemBack=new MenuItem("撤退"); 
    menuItemBack.addActionListener(menuClickListener); 
    menuItemClear=new MenuItem("清除"); 
    menuItemClear.addActionListener(menuClickListener); 
    menuItemEdit.add(menuItemBack);
    menuItemEdit.add(menuItemClear);
    setMenuBar(menuBarX); 
    
    openDlg = new FileDialog(this, "打开文件", FileDialog.LOAD);
    openDlg.setVisible(false);
    saveDlg = new FileDialog(this, "保存文件", FileDialog.SAVE);
    saveDlg.setVisible(false);
    openDlg.addWindowListener(new WindowAdapter()
      {
        public void windowClosing(WindowEvent e) 
        {
          openDlg.setVisible(false);
        }
      });

    saveDlg.addWindowListener(new WindowAdapter() 
      {
        public void windowClosing(WindowEvent e) 
        {
          saveDlg.setVisible(false);
        }
      });
        
		String shapeName[]={"直线","椭圆","矩形"};
				
		DrawShapeListener shapeBtnListener=new DrawShapeListener();
		JToolBar shapeBtnToolBar=new JToolBar();
		ButtonGroup shapeBtnGroup=new ButtonGroup();
		for(int i=0;i<shapeBtn.length;i++)
		{
			shapeBtn[i]=new JToggleButton(shapeName[i]);
			shapeBtn[i].addActionListener(shapeBtnListener);
			shapeBtnGroup.add(shapeBtn[i]);
			shapeBtnToolBar.add(shapeBtn[i]);
		}
		
					
		Container ctn=getContentPane();
		ctn.add(shapeBtnToolBar,BorderLayout.NORTH);//加载按钮
		ctn.add(jpp,BorderLayout.CENTER);//加载画板
		setSize(640,480);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	class DrawShapeListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
			for(int i=0;i<shapeBtn.length;i++)
			{
				if(e.getSource()==shapeBtn[i])
				  jpp.setShape(i);
			}
		}
	}
	
	class MenuClickListener implements ActionListener
	{
		public void actionPerformed(ActionEvent e)
		{
      if(e.getSource()==menuItemOpen)//Open pic from file
			{
				openDlg.setVisible(true);

        if (openDlg.getFile() != null)
        {
          jpp.openPicFile(openDlg.getDirectory(),openDlg.getFile());
        }
			}
			else if(e.getSource()==menuItemSave)//Save pic to file 
			{
				saveDlg.setVisible(true);
				jpp.savePicToFile(saveDlg.getDirectory(),saveDlg.getFile());
			}
			else if(e.getSource()==menuItemBack)  //back one step 
			{
				jpp.backOneStep();
			}
			else if(e.getSource()==menuItemClear)      //clear all data
			{
				jpp.clearAllData();
			}
		}
	}
	
	public static void main(String args[])
	{
		new JavaPainter();
	}
}

class XShape implements Serializable //记录形状和点坐标
{
    int nShape; //类型 
    int X1,Y1;  //起点
    int X2,Y2;   //终点

		XShape()
		{
			nShape=0;
			X1=0;
      Y1=0;
      X2=0;
      Y2=0;
    }
			
    XShape(int nShape, int X1, int Y1, int X2, int Y2) 
    {
        this.nShape=nShape;
        X1=X1;
        Y1=Y1;
        X2=X2;
        Y2=Y2;
    }
}

class JavaPaintPanel extends JPanel implements MouseListener,MouseMotionListener
{
	
	Vector <XShape> shapeObj = new Vector <XShape> ();
  
  FileInputStream fileIn = null; 
  ObjectInputStream objIn = null; 
  FileOutputStream fileOut = null; 
  ObjectOutputStream objOut = null; 
  
	int width=0;
	int height=0;
	
	XShape nShape=new XShape();
	
	public JavaPaintPanel()
	{
		super();		
		this.setBackground(Color.white);
		addMouseMotionListener(this);
		addMouseListener(this);
	}
	public void mousePressed(MouseEvent e)
	{
		nShape.X1=e.getX();
		nShape.Y1=e.getY();
	}
	public void mouseReleased(MouseEvent e)
	{
		nShape.X2=e.getX();
		nShape.Y2=e.getY();
		XShape pTmp=new XShape(nShape.nShape,nShape.X1,nShape.Y1,nShape.X2,nShape.Y2);
		shapeObj.addElement(pTmp);
		System.out.println("Point"+" "+nShape.nShape+" "+nShape.X1+" "+nShape.Y1+" "+nShape.X2+" "+nShape.Y2);
		repaint();
	}
	public void mouseEntered(MouseEvent e)
	{
	}
	public void mouseExited(MouseEvent e)
	{
	}
	public void mouseClicked(MouseEvent e)
	{
	}
	
	public void mouseDragged(MouseEvent e)
	{
		nShape.X2=e.getX();
		nShape.Y2=e.getY();
		repaint();
	}
	public void mouseMoved(MouseEvent e)
	{
	}
	public void paintShape(Graphics gX,XShape specRecord)  //画指定的形状 此函数为了代码重用
	{
		gX.setColor(Color.blue);
		switch(specRecord.nShape)
		{
			case 0://DRAWLINE
			  gX.drawLine(specRecord.X1,specRecord.Y1,specRecord.X2,specRecord.Y2);
			  break;
			case 1://DRAWELLIPSE
			  if((specRecord.Y2>=specRecord.Y1)&&(specRecord.X2>=specRecord.X1))
			  {
  			  width=specRecord.X2-specRecord.X1;
  			  height=specRecord.Y2-specRecord.Y1;
  			  gX.drawOval(specRecord.X1,specRecord.Y1,width,height);
  			}
  			else if((specRecord.Y2>=specRecord.Y1)&&(specRecord.X2<specRecord.X1))
			  {
  			  width=specRecord.X1-specRecord.X2;
  			  height=specRecord.Y2-specRecord.Y1;
  			  gX.drawOval(specRecord.X2,specRecord.Y1,width,height);
  			}
  			else if((specRecord.Y2<specRecord.Y1)&&(specRecord.X2<specRecord.X1))
			  {
  			  width=specRecord.X1-specRecord.X2;
  			  height=specRecord.Y1-specRecord.Y2;
  			  gX.drawOval(specRecord.X2,specRecord.Y2,width,height);
  			}
  			else
  			{
  				width=specRecord.X2-specRecord.X1;
  			  height=specRecord.Y1-specRecord.Y2;
  			  gX.drawOval(specRecord.X1,specRecord.Y2,width,height);
  			}
  						  
			  break;
			
			case 2://DRAWRECTANGLE
			  if((specRecord.Y2>=specRecord.Y1)&&(specRecord.X2>=specRecord.X1))
			  {
  			  width=specRecord.X2-specRecord.X1;
  			  height=specRecord.Y2-specRecord.Y1;
  			  gX.drawRect(specRecord.X1,specRecord.Y1,width,height);
  			}
  			else if((specRecord.Y2>=specRecord.Y1)&&(specRecord.X2<specRecord.X1))
			  {
  			  width=specRecord.X1-specRecord.X2;
  			  height=specRecord.Y2-specRecord.Y1;
  			  gX.drawRect(specRecord.X2,specRecord.Y1,width,height);
  			}
  			else if((specRecord.Y2<specRecord.Y1)&&(specRecord.X2<specRecord.X1))
			  {
  			  width=specRecord.X1-specRecord.X2;
  			  height=specRecord.Y1-specRecord.Y2;
  			  gX.drawRect(specRecord.X2,specRecord.Y2,width,height);
  			}
  			else 
  			{
  				width=specRecord.X2-specRecord.X1;
  			  height=specRecord.Y1-specRecord.Y2;
  			  gX.drawRect(specRecord.X1,specRecord.Y2,width,height);
  			}
  						  
			  break;
			}
			
	}
	
	/*public void update(Graphics g)
	{
		paint(g);	
	}
	*/
	public void paint(Graphics g)  //无法控制此调用
	{
		super.paint(g);

		for(int i=0;i<(shapeObj.size());i++)//
		{
			XShape pR=(XShape)shapeObj.elementAt(i);
			paintShape(g,pR);
			//System.out.println(pR.toString());			
		}
		paintShape(g,nShape); //此句完成拖动时的绘图--注意,因为此句的存在,导致当放开mouse后,最后的图形绘了两遍
	}
	public void setShape(int ShapeX)
	{
	  nShape.nShape=ShapeX;
  }
  public void savePicToFile(String strPath,String strName)
  {
  	try 
  	{
      File fout = new File(strPath,strName);
      fileOut = new FileOutputStream(fout);
      objOut = new ObjectOutputStream(fileOut);
      objOut.writeObject(shapeObj);
      objOut.close();
    }
    catch (IOException IOe) 
    {
      System.out.println("Can't Write Object to File");
    }
  }
  public void openPicFile(String strPath,String strName)
  {
  	repaint();
    try 
    {
      shapeObj.removeAllElements();
      File fIn = new File(strPath,strName);
      fileIn = new FileInputStream(fIn);
      objIn = new ObjectInputStream(fileIn);
      shapeObj = (Vector) objIn.readObject();
      objIn.close();
      repaint();
    }
    catch (ClassNotFoundException IOe2) 
    {
      System.out.println("File not found");
    } 
    catch (IOException IOe) 
    {
      repaint();
      System.out.println("Can't Read File");
    }
  }
  public void backOneStep()//撤退
  {
  	int nNmb=shapeObj.size();
  	if(nNmb!=0)
  	{
  		shapeObj.remove(nNmb-1);
  		resetShape();
  		repaint();
  	}
  }
  public void clearAllData() //清除全部
  {
  	if(shapeObj.size()!=0)
  	{
  		shapeObj.removeAllElements();
  		resetShape();
  		repaint();
  	}
  }
  public void resetShape()//不要忘了清掉最后的那个线条
  {
  	nShape.X1=0;  
  	nShape.Y1=0;
  	nShape.X2=0;
  	nShape.Y2=0;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -