📄 javapainter.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 + -