📄 drawingeditor.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.awt.geom.*;
import java.math.*;
import java.io.*;
import java.util.*;
import javax.swing.filechooser.*;
public class DrawingEditor
{
public static void main(String[] args)
{ //创建一个Frame
JFrame frame=new editorFrame();
//设置Frame的退出方式
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
//显示Frame
frame.show();
}
}
//创建画图用的editorFrame,继承自Jframe
class editorFrame extends JFrame
{
// 创建容器
private Container contentPane;
// 创建画图面版,此画图面板是自己定义的,请参看drawPanel类
private drawPanel drawingPanel=new drawPanel();
// 按钮定义
//直线按钮
private JButton lineButton;
//矩形按钮
private JButton rectButton;
//椭圆按钮
private JButton ellipseButton;
private JButton blueBack;
private JButton greenBack;
private JButton yellowBack;
private JButton openButton;
private JButton createButton;
private JButton saveButton;
// 工具栏上的“直线”按钮和鼠标事件的切换
// false:不能画,true:能画
private boolean lineBoolean=false;
private boolean rectBoolean=false;
private boolean ellipseBoolean=false;
// 鼠标按下位置座标,对应鼠标拖动事件的数据传递
private int linePressedX;
private int linePressedY;
private int rectPressedX;
private int rectPressedY;
private int ellipsePressedX;
private int ellipsePressedY;
// 菜单项
private JMenuItem openItem;
private JMenuItem saveItem;
private JMenuItem createItem;
private JMenuItem exitItem;
// 是否应存盘变量
// true:应该存盘
// false:可以不存盘存
private boolean saveBoolean=false;
// 操作日志
private JTextArea log;
static private final String newline = "\n";
//构造方法
public editorFrame()
{
super("画图编辑器");
//获得屏幕分辨率
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();
int screenHeight=screenSize.height;
int screenWidth=screenSize.width;
//设置屏幕中央
setSize(screenWidth / 2 , screenHeight / 2);
setLocation(screenWidth / 4, screenHeight / 4);
//设置图标
Image img=kit.getImage("Icon/drawing.gif");
setIconImage(img);
//创建当前面板
contentPane=getContentPane();
//设置菜单,创建JMenuBar
JMenuBar fileMenubar=new JMenuBar();
//创建JMenu
JMenu fileMenu=new JMenu("文件");
//创建JMenuItem
createItem=new JMenuItem("新建");
openItem=new JMenuItem("打开");
saveItem=new JMenuItem("保存");
exitItem=new JMenuItem("退出");
fileMenu.add(createItem);
fileMenu.add(openItem);
fileMenu.add(saveItem);
fileMenu.addSeparator();
fileMenu.add(exitItem);
//创建MenuAction事件
menuAction menuItemEvent=new menuAction();
openItem.addActionListener(menuItemEvent);
saveItem.addActionListener(menuItemEvent);
createItem.addActionListener(menuItemEvent);
exitItem.addActionListener(menuItemEvent);
fileMenubar.add(fileMenu);
setJMenuBar(fileMenubar);
//创建工具栏
JToolBar toolBar=new JToolBar("工具");
Action buttonAction=new Action();
//打开按钮
openButton=new JButton(new ImageIcon("Icon/open.gif"));
openButton.addActionListener(menuItemEvent);
openButton.setToolTipText("打开");
//新建按钮
createButton=new JButton(new ImageIcon("Icon/new.gif"));
createButton.addActionListener(menuItemEvent);
createButton.setToolTipText("新建");
//保存按钮
saveButton=new JButton(new ImageIcon("Icon/save.gif"));
saveButton.addActionListener(menuItemEvent);
saveButton.setToolTipText("保存");
//直线按钮
lineButton=new JButton(new ImageIcon("Icon/line.gif"));
lineButton.addActionListener(buttonAction);
lineButton.setToolTipText("直线");
//矩形按钮
rectButton=new JButton(new ImageIcon("Icon/rect.gif"));
rectButton.setToolTipText("矩形");
rectButton.addActionListener(buttonAction);
//椭圆按钮
ellipseButton=new JButton(new ImageIcon("Icon/ellipse.gif"));
ellipseButton.setToolTipText("椭圆");
ellipseButton.addActionListener(buttonAction);
//背景色按钮
greenBack=new JButton(new ImageIcon("Icon/green.gif"));
greenBack.setToolTipText("绿背景色");
greenBack.addActionListener(buttonAction);
blueBack=new JButton(new ImageIcon("Icon/blue.gif"));
blueBack.setToolTipText("蓝背景色");
blueBack.addActionListener(buttonAction);
yellowBack=new JButton(new ImageIcon("Icon/yellow.gif"));
yellowBack.setToolTipText("黄背景色");
yellowBack.addActionListener(buttonAction);
toolBar.add(createButton);
toolBar.add(openButton);
toolBar.add(saveButton);
toolBar.add(lineButton);
toolBar.add(rectButton);
toolBar.add(ellipseButton);
toolBar.add(greenBack);
toolBar.add(blueBack);
toolBar.add(yellowBack);
log = new JTextArea(2,20);
log.setBackground(Color.white);
log.setMargin(new Insets(6,6,6,6));
log.setEditable(false);
JScrollPane logScrollPane = new JScrollPane(log);
contentPane.add(logScrollPane, BorderLayout.SOUTH);
contentPane.add(toolBar,BorderLayout.NORTH);
//设置观感为windows
try
{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(editorFrame.this);
}
catch(Exception err) { err.printStackTrace(); }
}
//***********************************************************************************
//菜单按钮事件
class menuAction implements ActionListener
{
private boolean createBoolean=false;
private JFileChooser chooser=new JFileChooser();
private MouseActEvent mouseAct=new MouseActEvent();
public void actionPerformed(ActionEvent event)
{
//文件-->打开
if(event.getSource()==openItem||event.getSource()==openButton)
{
log.append("这是打开事件."+newline);
if(saveBoolean==true)
{
log.append("这是打开事件,请先保存文件."+newline);
}
else
{
if(createBoolean==true)contentPane.remove(drawingPanel);
int returnVal=chooser.showOpenDialog(editorFrame.this);
if(returnVal==JFileChooser.APPROVE_OPTION)
{
String filename=chooser.getSelectedFile().getPath();
log.append("文件名是:: "+filename+"."+newline);
//串行输入
try{
//输入文件名:filename
FileInputStream fileInput = new FileInputStream(filename);
ObjectInputStream objectStream = new ObjectInputStream(fileInput);
drawingPanel=(drawPanel)objectStream.readObject();
drawingPanel.addMouseListener(mouseAct);
drawingPanel.addMouseMotionListener(mouseAct);
contentPane.add(drawingPanel,BorderLayout.CENTER);
drawingPanel.repaint();
editorFrame.this.show();
objectStream.close();
}
catch (Exception err)
{
log.append("错误"+err.toString()+newline);
}
}
else
{
log.append("打开文件被取消."+newline);
}
}
}
//文件-->新建
else if(event.getSource()==createItem||event.getSource()==createButton)
{
log.append("这是新建事件."+newline);
if(saveBoolean==true)
{
log.append("请保存文件."+newline);
}
else
{
createBoolean=true;
drawingPanel.clear();
drawingPanel.addMouseListener(mouseAct);
drawingPanel.addMouseMotionListener(mouseAct);
contentPane.add(drawingPanel,BorderLayout.CENTER);
drawingPanel.repaint();
show();
}
}
//文件-->保存
else if((event.getSource()==saveItem||event.getSource()==saveButton))
{
log.append("这是保存事件."+newline);
int returnVal=chooser.showSaveDialog(editorFrame.this);
if (returnVal == JFileChooser.APPROVE_OPTION)
{
String fileName = chooser.getSelectedFile().getPath();
//对象串行输出
try
{
FileOutputStream fileOut = new FileOutputStream(fileName);
ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
objectOut.writeObject(drawingPanel);
objectOut.close();
saveBoolean=false;
log.append("保存文件成功."+newline);
}
catch (IOException err)
{
log.append("错误 -- "+err.toString()+"."+newline);
}
}
else
{
log.append("取消文件保存."+newline);
}
}
//文件-->退出
else if(event.getSource()==exitItem)
{
log.append("这是退出事件."+newline);
if(saveBoolean==true)
{
log.append("请保存文件."+newline);
}
else
{
System.exit(0);
}
}
}
}
//***********************************************************************************
//工具栏按钮事件
class Action implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
if(event.getSource()==lineButton)
{
log.append("这是直线按钮事件." + newline);
lineBoolean=true;
rectBoolean=false;
ellipseBoolean=false;
drawingPanel.dynamicArray(0,0,0,0,1);
}
else if(event.getSource()==rectButton)
{
log.append("这是矩形按钮事件."+newline);
rectBoolean=true;
lineBoolean=false;
ellipseBoolean=false;
drawingPanel.dynamicArray(0,0,0,0,2);
}
else if(event.getSource()==ellipseButton)
{
log.append("这是椭圆按钮事件."+newline);
ellipseBoolean=true;
lineBoolean=false;
rectBoolean=false;
drawingPanel.dynamicArray(0,0,0,0,3);
}
else if(event.getSource()==blueBack)
{
log.append("这是蓝背景色."+newline);
drawingPanel.setBackground(Color.blue);
}
else if(event.getSource()==greenBack)
{
log.append("这是绿背景色."+newline);
drawingPanel.setBackground(Color.green);
}
else if(event.getSource()==yellowBack)
{
log.append("这是黄背景色."+newline);
drawingPanel.setBackground(Color.yellow);
}
}
}
//***********************************************************************************
//鼠标事件
class MouseActEvent extends MouseAdapter implements MouseMotionListener
{
public void mouseDragged(MouseEvent event)
{
if(lineBoolean==true)
{
saveBoolean=true;
drawingPanel.dynamic(linePressedX,linePressedY,event.getX(),event.getY());
drawingPanel.repaint();
}
else if(rectBoolean==true)
{
saveBoolean=true;
drawingPanel.dynamic(rectPressedX,rectPressedY,event.getX(),event.getY());
drawingPanel.repaint();
}
else if(ellipseBoolean==true)
{
saveBoolean=true;
drawingPanel.dynamic(ellipsePressedX,ellipsePressedY,event.getX(),event.getY());
drawingPanel.repaint();
}
}
public void mousePressed(MouseEvent event)
{
if(lineBoolean==true)
{
linePressedX=event.getX();
linePressedY=event.getY();
}
if(rectBoolean==true)
{
rectPressedX=event.getX();
rectPressedY=event.getY();
}
if(ellipseBoolean==true)
{
ellipsePressedX=event.getX();
ellipsePressedY=event.getY();
}
}
public void mouseReleased(MouseEvent event)
{
if(lineBoolean==true)
{
drawingPanel.dynamicArray(linePressedX,linePressedY,event.getX(),event.getY(),1);
drawingPanel.repaint();
}
if(rectBoolean==true)
{
drawingPanel.dynamicArray(rectPressedX,rectPressedY,event.getX(),event.getY(),2);
drawingPanel.repaint();
}
if(ellipseBoolean==true)
{
drawingPanel.dynamicArray(ellipsePressedX,ellipsePressedY,event.getX(),event.getY(),3);
drawingPanel.repaint();
}
}
public void mouseMoved(MouseEvent event)
{
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -