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

📄 drawframe.java

📁 简单的画图程序
💻 JAVA
字号:
package boya;
import java.io.*;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;

class DrawFrame extends JFrame implements ID,ActionListener,Observer{
 private Draw theApp;
 private JMenuBar menubar=new JMenuBar();
 private JToolBar toolBar=new JToolBar();
 private StatusBar statusBar=new StatusBar();
 private FontDialog fontDlg;
 private JMenuItem aboutItem,fontItem,customColorItem;
 private JPopupMenu popup;
 private FileAction newAction,openAction,closeAction,saveAction,
                    saveAsAction;
 private TypeAction lineAction,rectangleAction,circleAction,curveAction,textAction;
 private ColorAction redAction,yellowAction,greenAction,blueAction;
 private Color elementColor=DEFAULT_ELEMENT_COLOR;
 private int elementType=DEFAULT_ELEMENT_TYPE;
 private Font font=DEFAULT_FONT;
 private String frameTitle,filename=DEFAULT_FILENAME;
 private File modelFile;
 private boolean changed=false;
 private JFileChooser files;
 class FileAction extends AbstractAction{
  FileAction(String name,String tooltip){
   super(name);
   String icons="res/"+name+".gif";
   if(new File(icons).exists())
    putValue(SMALL_ICON,new ImageIcon(icons));
   if(tooltip!=null)
    putValue(SHORT_DESCRIPTION,tooltip);
  }
  public void actionPerformed(ActionEvent e){
   String name=(String)getValue(NAME);
   if(name.equals(newAction.getValue(NAME))){
    checkForSave();
    theApp.insertModel(new DrawModel());
    modelFile=null;
    filename=DEFAULT_FILENAME;
    setTitle(frameTitle+files.getCurrentDirectory()+"\\"+filename);
    changed=false;
   }
   else if(name.equals(openAction.getValue(NAME))){
    checkForSave();
    File file=showDialog("打开文件","打开","读一个文件",'o',null);
    if(file!=null)
     openDraw(file); 
   }
   else if(name.equals(closeAction.getValue(NAME))){
    checkForSave();
    System.exit(0);
   }
   else if(name.equals(saveAction.getValue(NAME))){
    saveIt();
   }
   else if(name.equals(saveAsAction.getValue(NAME))){
    File file=showDialog("另存为","保存","保存图片",'s',
        modelFile==null?new File(
        files.getCurrentDirectory(),filename):modelFile);
    if(file!=null){
     if(file.exists()&&!file.equals(modelFile))
      if(JOptionPane.NO_OPTION==
       JOptionPane.showConfirmDialog(
        DrawFrame.this,file.getName()+"已存在,覆盖?",
        "确认保存",JOptionPane.YES_NO_OPTION,
        JOptionPane.WARNING_MESSAGE))
       return;
    saveDraw(file);
    }
    return;
   }
  }
 }
 class ColorAction extends AbstractAction{
  private Color color;
  ColorAction(String name,Color color,String tooltip){
   super(name);
   this.color=color;
   String icons="res/"+name+".gif";
   if(new File(icons).exists())
    putValue(SMALL_ICON,new ImageIcon(icons));
   if(tooltip!=null)
    putValue(SHORT_DESCRIPTION,tooltip);
  }
  public void actionPerformed(ActionEvent e){
   elementColor=color;
   statusBar.setColorPane(color);
  }
 }
 class TypeAction extends AbstractAction{
  private int typeID;
  TypeAction(String name,int typeID,String tooltip){
   super(name);
   this.typeID=typeID;
   String icons="res/"+name+".gif";
   if(new File(icons).exists())
    putValue(SMALL_ICON,new ImageIcon(icons));
   if(tooltip!=null)
    putValue(SHORT_DESCRIPTION,tooltip);
  }
  public void actionPerformed(ActionEvent e){
   elementType=typeID;
   statusBar.setTypePane(typeID);
  }
 }
 public DrawFrame(String title,Draw theApp){
  setTitle(title);
  this.theApp=theApp;
  setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
  setJMenuBar(menubar);
  //一级菜单
  JMenu fileMenu=new JMenu("文件(F)");
  JMenu elementMenu=new JMenu("图形(E)");
  JMenu optionsMenu=new JMenu("选项(O)");
  JMenu helpMenu=new JMenu("帮助(H)");
  fileMenu.setMnemonic('F');
  elementMenu.setMnemonic('E');
  optionsMenu.setMnemonic('O');
  helpMenu.setMnemonic('H');
  //二级菜单
  addMenuItem(fileMenu,newAction=new FileAction("新建","创建新文件"),KeyStroke
     .getKeyStroke('N',Event.CTRL_MASK));
  addMenuItem(fileMenu,openAction=new FileAction("打开","打开文件"),KeyStroke
     .getKeyStroke('O',Event.CTRL_MASK));
  addMenuItem(fileMenu,closeAction=new FileAction("关闭","关闭程序"),KeyStroke
     .getKeyStroke('X',Event.CTRL_MASK));
  fileMenu.addSeparator();
  addMenuItem(fileMenu,saveAction=new FileAction("保存","保存文件"),KeyStroke
     .getKeyStroke('S',Event.CTRL_MASK));
  addMenuItem(fileMenu,saveAsAction=new FileAction("另存为...","文件另存为"));
  fileMenu.addSeparator();
  addMenuItem(elementMenu,lineAction=new TypeAction("直线",LINE,"绘制直线"),KeyStroke
     .getKeyStroke('1',Event.CTRL_MASK));
  addMenuItem(elementMenu,rectangleAction=new TypeAction("矩形",RECTANGLE,"绘制矩形"),KeyStroke
     .getKeyStroke('2',Event.CTRL_MASK));
  addMenuItem(elementMenu,circleAction=new TypeAction("椭圆",CIRCLE,"绘制椭圆"),KeyStroke
     .getKeyStroke('3',Event.CTRL_MASK));
  addMenuItem(elementMenu,curveAction=new TypeAction("曲线",CURVE,"绘制曲线"),KeyStroke
     .getKeyStroke('4',Event.CTRL_MASK));
  addMenuItem(elementMenu,textAction=new TypeAction("文字",TEXT,"输入文字"),KeyStroke
     .getKeyStroke('5',Event.CTRL_MASK));
  elementMenu.addSeparator();
  JMenu colorMenu=new JMenu("颜色");
  elementMenu.add(colorMenu);
  addMenuItem(colorMenu,redAction=new ColorAction("红色",Color.red,"绘制红色"),KeyStroke
     .getKeyStroke('1',Event.ALT_MASK));
  addMenuItem(colorMenu,yellowAction=new ColorAction("黄色",Color.yellow,"绘制黄色"),KeyStroke
     .getKeyStroke('2',Event.ALT_MASK));
  addMenuItem(colorMenu,greenAction=new ColorAction("绿色",Color.green,"绘制绿色"),KeyStroke
     .getKeyStroke('3',Event.ALT_MASK));
  addMenuItem(colorMenu,blueAction=new ColorAction("蓝色",Color.blue,"绘制蓝色"),KeyStroke
     .getKeyStroke('4',Event.ALT_MASK));
  aboutItem=new JMenuItem("关于");
  aboutItem.setAccelerator(KeyStroke.getKeyStroke('A',Event.CTRL_MASK));
  aboutItem.addActionListener(this);
  helpMenu.add(aboutItem);
  fontItem=new JMenuItem("字体选择");
  fontItem.setAccelerator(KeyStroke.getKeyStroke('T',Event.CTRL_MASK));
  fontItem.addActionListener(this);
  optionsMenu.add(fontItem);
  customColorItem=new JMenuItem("颜色选择");
  customColorItem.setAccelerator(KeyStroke.getKeyStroke('R',Event.CTRL_MASK));
  customColorItem.addActionListener(this);
  optionsMenu.add(customColorItem);
  menubar.add(fileMenu);
  menubar.add(elementMenu);
  menubar.add(optionsMenu);
  menubar.add(helpMenu);
  //工具栏的设置
  toolBar.add(newAction);
  toolBar.add(openAction);
  toolBar.add(saveAction);
  toolBar.addSeparator();
  toolBar.add(lineAction);
  toolBar.add(rectangleAction);
  toolBar.add(circleAction);
  toolBar.add(curveAction);
  toolBar.add(textAction);
  toolBar.addSeparator();
  toolBar.add(redAction);
  toolBar.add(yellowAction);
  toolBar.add(greenAction);
  toolBar.add(blueAction);
  getContentPane().add(toolBar,BorderLayout.NORTH);
  toolBar.setFloatable(false);//工具栏禁止漂浮
  getContentPane().add(statusBar,BorderLayout.SOUTH);
  fontDlg=new FontDialog(this);
  popup=new JPopupMenu("General");
  popup.add(lineAction);
  popup.add(rectangleAction);
  popup.add(circleAction);
  popup.add(curveAction);
  popup.add(textAction);
  popup.addSeparator();
  popup.add(redAction);
  popup.add(yellowAction);
  popup.add(greenAction);
  popup.add(blueAction);
  files=new JFileChooser(DEFAULT_DIR);
  frameTitle=title+":";
  setTitle(frameTitle+filename);
  if(!DEFAULT_DIR.exists())
   if(!DEFAULT_DIR.mkdirs())
    JOptionPane.showMessageDialog(this,"建立文件失败!","错误",JOptionPane.ERROR_MESSAGE);
 }
 private JMenuItem addMenuItem(JMenu menu,Action action){
  //重载添加菜单元素的函数使其不具有图象,不具有快键
  JMenuItem item=menu.add(action);
  item.setIcon(null);
  return item;
 }
 private JMenuItem addMenuItem(JMenu menu,Action action,KeyStroke keys){
  //重载添加菜单元素的函数使其不具有图象,具有快键
  JMenuItem item=menu.add(action);
  item.setIcon(null);
  item.setAccelerator(keys);
  return item;
 }
 private JButton addToolBarButton(Action action){
  //重载添加工具栏按钮
  JButton button=toolBar.add(action);
  button.setText(null);
  return button;
 }
 public Color getElementColor(){
  return elementColor;
 }
 public int getElementType(){
  return elementType;
 }
 public Font getFont(){
  return font;
 }
 public void setFont(Font font){
   this.font=font;
 }
 public JPopupMenu getPopup(){
  return popup;
 }
 public void actionPerformed(ActionEvent e){
  if(e.getSource()==aboutItem){
   JOptionPane.showMessageDialog((Component)e.getSource(),"版本说明:画图软件1.0"
    ,"关于",JOptionPane.INFORMATION_MESSAGE);
  }
  else if(e.getSource()==fontItem){
   Rectangle bounds=getBounds();
   fontDlg.setLocation(bounds.x+bounds.width/3,bounds.y+bounds.height/3);
   fontDlg.setVisible(true);
  }
  else if(e.getSource()==customColorItem){
   Color color=JColorChooser.showDialog(this,"颜色选择",elementColor);
   if(color!=null){
    elementColor=color;
    statusBar.setColorPane(color);
   }
  }
 }
 public void update(Observable o,Object obj){
  changed=true;
 }
 private File showDialog(String dlgTitle,String ABT,String ABTP,
  char ABM,File file){
   files.setDialogTitle(dlgTitle);
   files.setApproveButtonText(ABT);
   files.setApproveButtonToolTipText(ABTP);
   files.setApproveButtonMnemonic(ABM);
   files.rescanCurrentDirectory();
   files.setSelectedFile(file);
   int result=files.showDialog(DrawFrame.this,null);
   return(result==files.APPROVE_OPTION)?files.getSelectedFile():null;
 }
 private void saveIt(){
  if(!changed) return;
  if(modelFile!=null)
   saveDraw(modelFile);
  else{
   File file=showDialog("保存图片","保存","保存图片",'s',
    new File(files.getCurrentDirectory(),filename));
   if(file==null)
    return;
   else 
    if(file.exists())
     if(JOptionPane.NO_OPTION==JOptionPane.showConfirmDialog(DrawFrame.this,file.getName()+"已存在,覆盖?"
     ,"确认保存",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE))
      return;
   saveDraw(file);
  }
 }
 private void saveDraw(File outFile){
  try{
   ObjectOutputStream out=new ObjectOutputStream(new
         BufferedOutputStream(
         new FileOutputStream(outFile)));
   out.writeObject(theApp.getModel());
   out.flush();
   out.close();
  }
  catch(IOException e){
   System.out.println(e);
   JOptionPane.showMessageDialog(DrawFrame.this,"错误","保存失败",JOptionPane.ERROR_MESSAGE);
   return;
  }
  if(outFile!=modelFile){
   modelFile=outFile;
   filename=modelFile.getName();
   setTitle(frameTitle+modelFile.getPath());
  }
  changed=false;
 }
 public void openDraw(File inFile){
  try{
   ObjectInputStream in=new ObjectInputStream(new
         BufferedInputStream(
         new FileInputStream(inFile)));
   theApp.insertModel((DrawModel)in.readObject());
   in.close();
   modelFile=inFile;
   filename=modelFile.getName();
   setTitle(frameTitle+modelFile.getPath());
  }
  catch(Exception e){
   System.out.println(e);
   JOptionPane.showMessageDialog(DrawFrame.this,"错误","打开失败",JOptionPane.ERROR_MESSAGE);
   return;
  }
 }
 public void checkForSave(){
  if(changed)
   if(JOptionPane.YES_OPTION==JOptionPane.showConfirmDialog(DrawFrame.this,"文件已修改,保存?"
     ,"确认保存",JOptionPane.YES_NO_OPTION,JOptionPane.WARNING_MESSAGE))
    saveIt();
 }
}

⌨️ 快捷键说明

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