从画图程序开始,走进GUI编程世界

原创 2005年03月01日 12:17:00

从画图程序开始,走进GUI编程世界

Java、画图

//以下是画图的Java版

package boya;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class Draw{
 private DrawModel model;
 private DrawView view;
 private static DrawFrame window;
 private static Draw theApp;
 public static void main(String[] args){
  theApp=new Draw();
  theApp.init();
 }
 public void init(){
  window=new DrawFrame("画板",this);
  Toolkit theKit=window.getToolkit();
  Dimension wndsize=theKit.getScreenSize();
  window.setBounds(wndsize.width/6,wndsize.height/6,//位置
      2*wndsize.width/3,2*wndsize.height/3);//大小
  model=new DrawModel();
  view=new DrawView(this);
  model.addObserver((Observer)view);
  model.addObserver((Observer)window);
  window.getContentPane().add(view,BorderLayout.CENTER);
  window.setVisible(true);
 }
 public DrawFrame getWindow(){
  return window;
 }
 public DrawModel getModel(){
  return model;
 }
 public DrawView getView(){
  return view;
 }
 class WindowHandler extends WindowAdapter{
  public void windowClosing(WindowEvent e){
   window.checkForSave();
   window.dispose();//关闭窗口
   System.exit(0);//关闭程序
  }
 }
 public void insertModel(DrawModel anew){
  model=anew;
  model.addObserver((Observer)view);
  model.addObserver((Observer)window);
  view.repaint();
 }  
}

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,printAction;
 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;
   }
   else if(name.equals(printAction.getValue(NAME))){
   }
  }
 }
 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(fileMenu,printAction=new FileAction("打印","打印文件"),KeyStroke
     .getKeyStroke('P',Event.CTRL_MASK));
  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.add(printAction);
  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(),"版本说明:画图软件由博雅制作"
    ,"关于",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();
 }
}

package boya;
import java.io.*;
import java.util.*;
class DrawModel extends Observable implements Serializable{
 protected LinkedList elements=new LinkedList();
 public void add(Elements element){
  elements.add(element);
  setChanged();
  notifyObservers(element.getBounds());
 }
 public boolean remove(Elements element){
  boolean removed=elements.remove(element);
  if(removed){
   setChanged();
   notifyObservers(element.getBounds());
  }
  return removed;
 }
 public Iterator getIterator(){
  return elements.listIterator();
 }
}

package boya;
import java.awt.*;
import java.util.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
class DrawView extends JComponent implements Observer,ID{
 private Draw theApp;
 public DrawView(Draw theApp){
  this.theApp=theApp;
  MouseHandler handler=new MouseHandler();
  addMouseListener(handler);
  addMouseMotionListener(handler);
 }
 class MouseHandler extends MouseInputAdapter{
  private Point start,end;
  private Elements temp;
  private Graphics2D g2D;
  private Elements createElement(Point start,Point end){
   switch(theApp.getWindow().getElementType()){
    case LINE:
     return new Elements.Line(start,end,theApp.getWindow().getElementColor());
    case RECTANGLE:
     return new Elements.Rectangle(start,end,theApp.getWindow().getElementColor());
    case CIRCLE:
     return new Elements.Circle(start,end,theApp.getWindow().getElementColor());
    case CURVE:
     return new Elements.Curve(start,end,theApp.getWindow().getElementColor());
   }
   return null;
  }
  public void mousePressed(MouseEvent e){
   start=e.getPoint();
   int modifier=e.getModifiers();
   if((modifier&e.BUTTON1_MASK)!=0){
    g2D=(Graphics2D)getGraphics();
    g2D.setXORMode(getBackground());
    g2D.setPaint(theApp.getWindow().getElementColor());
   }
  }
  public void mouseDragged(MouseEvent e){
   end=e.getPoint();
   int modifier=e.getModifiers();
   if((modifier&e.BUTTON1_MASK)!=0&&(theApp.getWindow()
    .getElementType()!=TEXT)){
    if(temp==null)
     temp=createElement(start,end);
    else{
     temp.draw(g2D);
     temp.moving(start,end);
    }
    temp.draw(g2D);
   }
  }
  public void mouseReleased(MouseEvent e){
   int modifier=e.getModifiers();
   if(e.isPopupTrigger()){
    start=e.getPoint();
    theApp.getWindow().getPopup().show((Component)e.getSource(),
         start.x,start.y);
    start=null;
   }
   else if((modifier&e.BUTTON1_DOWN_MASK)==0&&(theApp.getWindow()
    .getElementType()!=TEXT)){
    if(temp!=null){
     theApp.getModel().add(temp);
     temp=null;
    }
    if(g2D!=null){
     g2D.dispose();
     g2D=null;
    }
    start=end=null;
   }
  }
  public void mouseClicked(MouseEvent e){
   int modifier=e.getModifiers();
   if((modifier&e.BUTTON1_MASK)!=0&&(theApp.getWindow()
    .getElementType()==TEXT)){
    start=e.getPoint();
    String text=JOptionPane.showInputDialog(
       (Component)e.getSource(),"输入文字"
       ,"文字",JOptionPane.PLAIN_MESSAGE);
    if(text!=null){
     g2D=(Graphics2D)getGraphics();
     Font font=theApp.getWindow().getFont();
     temp=new Elements.Text(font,text,start,
       theApp.getWindow().getElementColor(),
       font.getStringBounds(text,g2D.getFontRenderContext()).getBounds());
     temp.draw(g2D);
     if(temp!=null)
      theApp.getModel().add(temp);
     temp=null;
     g2D.dispose();
     g2D=null;
     start=null;
    }
   }
  }
   
 }
 public void update(Observable o,Object rectangle){
  if(rectangle==null)
   repaint();
  else repaint((Rectangle)rectangle);
 }
 public void paint(Graphics g){
  Graphics2D g2D=(Graphics2D)g;
  Iterator elements=theApp.getModel().getIterator();
  Elements element;
  while(elements.hasNext()){
   element=(Elements)elements.next();
   element.draw(g2D);
  }
 }
}

package boya;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.awt.geom.*;
abstract class Elements implements Serializable{
 protected Color color;
 public Elements(Color color){
  this.color=color;
 }
 public Color getColor(){
  return color;
 }
 public abstract java.awt.Rectangle getBounds();
 public abstract void moving(Point start,Point end);
 public abstract void draw(Graphics2D g2D);
 public static class Line extends Elements{
  private Line2D.Double line;
  public Line(Point start,Point end,Color color){
   super(color);
   line=new Line2D.Double(start,end);
  }
  public java.awt.Rectangle getBounds(){
   return line.getBounds();
  }
  public void moving(Point start,Point end){
   line.x2=end.x;
   line.y2=end.y;
  }
  public void draw(Graphics2D g2D){
   g2D.setPaint(color);
   g2D.draw(line);
  }
  private void writeObject(ObjectOutputStream out)
      throws IOException{
   out.writeDouble(line.x2);
   out.writeDouble(line.y2);
  }
  private void readObject(java.io.ObjectInputStream in)
      throws IOException,ClassNotFoundException{
   double x2=in.readDouble();
   double y2=in.readDouble();
   line=new Line2D.Double(0,0,x2,y2);
  }
 }
 public static class Rectangle extends Elements{
  private Rectangle2D.Double rectangle;
  public Rectangle(Point start,Point end,Color color){
   super(color);
   rectangle=new Rectangle2D.Double(
    Math.min(start.x,end.x),Math.min(start.y,end.y),
    Math.abs(start.x-end.x),Math.abs(start.y-end.y));
  }
  public java.awt.Rectangle getBounds(){
   return rectangle.getBounds();
  }
  public void moving(Point start,Point end){
   rectangle.x=Math.min(start.x,end.x);
   rectangle.y=Math.min(start.y,end.y);
   rectangle.width=Math.abs(start.x-end.x);
   rectangle.height=Math.abs(start.y-end.y);
  }
  public void draw(Graphics2D g2D){
   g2D.setPaint(color);
   g2D.draw(rectangle);
  }
  private void writeObject(ObjectOutputStream out)
      throws IOException{
   out.writeDouble(rectangle.width);
   out.writeDouble(rectangle.height);
  }
  private void readObject(java.io.ObjectInputStream in)
      throws IOException,ClassNotFoundException{
   double width=in.readDouble();
   double height=in.readDouble();
   rectangle=new Rectangle2D.Double(0,0,width,height);
  }
 }
 public static class Circle extends Elements{
  private Ellipse2D.Double circle;
  public Circle(Point center,Point circum,Color color){
   super(color);
   double radius=center.distance(circum);
   circle=new Ellipse2D.Double(center.x-radius,center.y-radius,2*radius,2*radius);
  }
  public java.awt.Rectangle getBounds(){
   return circle.getBounds();
  }
  public void moving(Point center,Point circum){
   double radius=center.distance(circum);
   circle.x=center.x-(int)radius;
   circle.y=center.y-(int)radius;
   circle.width=circle.height=2*radius;
  }
  public void draw(Graphics2D g2D){
   g2D.setPaint(color);
   g2D.draw(circle);
  }
  private void writeObject(ObjectOutputStream out)
      throws IOException{
   out.writeDouble(circle.width);
  }
  private void readObject(java.io.ObjectInputStream in)
      throws IOException,ClassNotFoundException{
   double width=in.readDouble();
   circle=new Ellipse2D.Double(0,0,width,width);
  }
 }
 public static class Curve extends Elements{
  private GeneralPath curve;
  public Curve(Point start,Point next,Color color){
   super(color);
   curve=new GeneralPath();
   curve.moveTo(start.x,start.y);
   curve.lineTo(next.x,next.y);
  }
  public java.awt.Rectangle getBounds(){
   return curve.getBounds();
  }
  public void moving(Point start,Point next){
   curve.lineTo(next.x,next.y);
  }
  public void draw(Graphics2D g2D){
   g2D.setPaint(color);
   g2D.draw(curve);
  }
  private void writeObject(ObjectOutputStream out)
      throws IOException{
   PathIterator iterator=curve.getPathIterator(new AffineTransform());
   Vector coords=new Vector();
   int max=6;
   float[] temp=new float[max];
   int result=iterator.currentSegment(temp);
   if(!(result==iterator.SEG_MOVETO)){
    System.out.println("No Starting moveto");
    return;
   }
   iterator.next();
   while(!iterator.isDone()){
    result=iterator.currentSegment(temp);
    if(!(result==iterator.SEG_LINETO)){
     System.out.println("Invalid segment type");
     return;
    }
    coords.add(new Float(temp[0]));
    coords.add(new Float(temp[1]));
    iterator.next();
   }
   out.writeObject(coords);
  }
  private void readObject(java.io.ObjectInputStream in)
      throws IOException,ClassNotFoundException{
   Vector coords=(Vector)in.readObject();
   curve=new GeneralPath();
   curve.moveTo(0,0);
   float x,y;
   for(int i=0;i<coords.size();i+=2){
    x=((Float)coords.get(i)).floatValue();
    y=((Float)coords.get(i+1)).floatValue();
    curve.lineTo(x,y);
   }
  }

 }
 public static class Text extends Elements{
  private Font font;
  private String text;
  private Point pos;
  private java.awt.Rectangle bounds=null;
  public Text(Font font,String text,Point pos,Color color,java.awt.Rectangle bounds){
   super(color);
   this.font=font;
   this.text=text;
   this.pos=pos;
   this.bounds=bounds;
   this.bounds.setLocation(pos.x,pos.y-(int)bounds.getHeight());
  }
  public java.awt.Rectangle getBounds(){
   return bounds;
  }
  public void moving(Point start,Point end){
  }
  public void draw(Graphics2D g2D){
   g2D.setPaint(color);
   Font oldFont=g2D.getFont();
   g2D.setFont(font);
   g2D.drawString(text,pos.x,pos.y);
   g2D.setFont(oldFont);
  }
 }
}

package boya;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
class FontDialog extends JDialog implements ID,ActionListener
        ,ListSelectionListener{
 private DrawFrame window;
 private Font font;
 private int style;
 private int size;
 private JButton ok,cancel;
 private JList fontList;
 private JLabel fontDisplay;
 private JComboBox chooseSize;
 public FontDialog(DrawFrame window){
  super(window,"字体选择",true);
  this.window=window;
  font=window.getFont();
  style=font.getStyle();
  size=font.getSize();
  JPanel buttonPane=new JPanel();
  buttonPane.add(ok=createButton("确认"));
  buttonPane.add(cancel=createButton("取消"));
  getContentPane().add(buttonPane,BorderLayout.SOUTH);
  JPanel dataPane=new JPanel();
  dataPane.setBorder(BorderFactory.createCompoundBorder(
       BorderFactory.createLineBorder(Color.black),
       BorderFactory.createEmptyBorder(5,5,5,5)));
  GridBagLayout gbLayout=new GridBagLayout();
  dataPane.setLayout(gbLayout);
  GridBagConstraints constraints=new GridBagConstraints();
  JLabel label=new JLabel("选择字体");
  constraints.fill=GridBagConstraints.HORIZONTAL;
  constraints.gridwidth=GridBagConstraints.REMAINDER;
  gbLayout.setConstraints(label,constraints);
  dataPane.add(label);
  GraphicsEnvironment e=GraphicsEnvironment.getLocalGraphicsEnvironment();
  String[] fonts=e.getAvailableFontFamilyNames();
  fontList=new JList(fonts);
  fontList.setValueIsAdjusting(true);
  fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  fontList.setSelectedValue(font.getFamily(),true);
  fontList.addListSelectionListener(this);
  JScrollPane chooseFont=new JScrollPane(fontList);
  chooseFont.setMinimumSize(new Dimension(300,100));
  JPanel display=new JPanel();
  fontDisplay=new JLabel("字体样例:x X y Y z Z");
  fontDisplay.setPreferredSize(new Dimension(300,100));
  display.add(fontDisplay);
  JSplitPane splitPane=new JSplitPane(JSplitPane.VERTICAL_SPLIT,true,chooseFont,display);
  gbLayout.setConstraints(splitPane,constraints);
  dataPane.add(splitPane);
  JPanel sizePane=new JPanel();
  label=new JLabel("选择字体大小");
  sizePane.add(label);
  String[] sizeList={"8","10","12","14","16","18","20","22","24"};
  chooseSize=new JComboBox(sizeList);
  chooseSize.setSelectedItem(Integer.toString(size));
  chooseSize.addActionListener(this);
  sizePane.add(chooseSize);
  gbLayout.setConstraints(sizePane,constraints);
  dataPane.add(sizePane);
  JRadioButton bold=new JRadioButton("加粗",(style&Font.BOLD)>0);
  JRadioButton italic=new JRadioButton("斜体",(style&Font.ITALIC)>0);
  bold.addItemListener(new StyleListener(Font.BOLD));
  italic.addItemListener(new StyleListener(Font.ITALIC));
  JPanel stylePane=new JPanel();
  stylePane.add(bold);
  stylePane.add(italic);
  gbLayout.setConstraints(stylePane,constraints);
  dataPane.add(stylePane);
  getContentPane().add(dataPane,BorderLayout.CENTER);
  pack();
  setVisible(false);
 }
 JButton createButton(String label){
  JButton button=new JButton(label);
  button.setPreferredSize(new Dimension(80,20));
  button.addActionListener(this);
  return button;
 }
 public void actionPerformed(ActionEvent e){
  Object source=e.getSource();
  if(source==ok){
   window.setFont(font);
   setVisible(false);
  }
  else if(source==cancel)
   setVisible(false);
  else if(source==chooseSize){
   size=Integer.parseInt((String)chooseSize.getSelectedItem());
   font=font.deriveFont((float)size);
   fontDisplay.setFont(font);
   fontDisplay.repaint();
  }
 }
 public void valueChanged(ListSelectionEvent e){
  if(!e.getValueIsAdjusting()){
   font=new Font((String)fontList.getSelectedValue(),style,size);
   fontDisplay.setFont(font);
   fontDisplay.repaint();
  }
 }
 class StyleListener implements ItemListener{
  private int astyle;
  public StyleListener(int style){
   this.astyle=style;
  }
  public void itemStateChanged(ItemEvent e){
   if(e.getStateChange()==ItemEvent.SELECTED)
    style|=astyle;
   else style&=~astyle;
   font=font.deriveFont(style);
   fontDisplay.setFont(font);
   fontDisplay.repaint();
  }
 }  
}


package boya;
import java.awt.*;
import java.io.File;
public interface ID{
 int LINE=101;
 int RECTANGLE=102;
 int CIRCLE=103;
 int CURVE=104;
 int TEXT=105;
 int DEFAULT_ELEMENT_TYPE=LINE;
 Color DEFAULT_ELEMENT_COLOR=Color.red;
 Font DEFAULT_FONT=new Font("宋体",Font.PLAIN,20);
 File DEFAULT_DIR=new File("c:/My Draw");
 String DEFAULT_FILENAME="Untitled.ice";
}

package boya;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
class StatusBar extends JPanel implements ID{
 private StatusPane colorPane=new StatusPane("红色");
 private StatusPane typePane=new StatusPane("直线");
 class StatusPane extends JLabel{
  private Font paneFont=new Font("宋体",Font.PLAIN,12);
  public StatusPane(String text){
   setForeground(Color.black);
   setFont(paneFont);
   setHorizontalAlignment(CENTER);
   setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));;
   setPreferredSize(new Dimension(70,18));
   setText(text);
  }
 }
 public StatusBar(){
  setLayout(new FlowLayout(FlowLayout.RIGHT,10,3));
  setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
  setColorPane(DEFAULT_ELEMENT_COLOR);
  setTypePane(DEFAULT_ELEMENT_TYPE);
  add(colorPane);
  add(typePane);
 }
 public void setColorPane(Color color){
  String text;
  if(color.equals(Color.red))
   text="红色";
  else if(color.equals(Color.yellow))
   text="黄色";
  else if(color.equals(Color.green))
   text="绿色";
  else if(color.equals(Color.blue))
   text="蓝色";
  else text="未定义";
  colorPane.setText(text);
 }
 public void setTypePane(int element){
  String text;
  switch(element){
   case LINE:
    text="直线";
    break;
   case RECTANGLE:
    text="矩形";
    break;
   case CIRCLE:
    text="圆";
    break;
   case CURVE:
    text="曲线";
    break;
   case TEXT:
    text="文字";
    break;
   default:
    text="错误";
    break;
  }
  typePane.setText(text);
 }
}


最后还可以将生成的代码放置到JAR包中,这样就可以在安装JVM的环境下,使
此JAR包作为可执行文件了。

包的结构如下:
--Draw
----boya
----META-INF
----res

其分别为包、配置文件、资源

在META-INF中建立文件MANIFEST.MF写入:
Manifest-Version: 1.0
Main-Class: boya.Draw


这样这个包就完成了
Main-Class: boya.Draw

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

走进C++程序世界------异常处理

一、 概述 C++自身有着非常强的纠错能力,发展到如今,已经建立了比较完善的异常处理机制。C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句,函数,结构和类,致使编译程序无法进行...

走进C++程序世界----类型转换运算符

C++的四个类型转换运算符已经有很久了,但一直没有弄清楚它们的用法,今天看到一本书上的解释,才大致地的了解了其具体的用法. 看下面具体的代码: /* *cast_operator.cpp *c...

走进C++程序世界-----指针(动态申请空间和释放空间)

使用关键字NEW分配内存     在讲解分配内存之前,首先来理解下内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区这些也是初学者容易混淆的地方。我的博客中有一篇文章描述C语言中代码分配情况...

走进C++程序世界------IO标准库介绍

流概述    流是C++标准的组成部分,流的主要目标是,将从磁盘读取文件或将输入写入控制台屏幕的问题封装起来,创建流后程序员就可以使用它,流将负责处理所有的细节。 IO类库 在C++输入、输出操作是...

带您走进松本行弘的程序世界

编者按:   在此书上市之前,特别对此书做一下方向说明,《松本行弘的程序世界》适合各层次程序设计人员和编程爱好者,也可以供相关技术人员参考。   本书的目的不是深入讲解哪种特定的技术,也没有全面讨论我...

走进C++程序世界-------类的定义和使用(数据成员和方法成员,析构函数,构造函数,内联实现)

类的成员简介  在C++中,可以通过声明一个类来穿件一种新的类型。类将一组变量(他们的类型通常不同)和一组相关的函数组合在一起。类可以有各种类型的变量组成,还可以包含其他类对象。成员变量称为数据成员它...

走进C++程序世界-----私有继承

私有继承:     在C++编程语言中,在声明一个派生类时将基类的继承方式指定为private的称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class),...

走进STM32世界之Hex程序烧写

走进STM32世界之Hex程序烧写 在光立方活动中,有少部分网友提出不会将HEX程序烧录至STM32芯片内,也为了早就想开始的STM32系列基础教程,在北京的这个雨夜开始“走进STM32世界”。 ...

走进C++程序世界------操作符运算、操作符重载、转换运算符、双目元算、+=,-+运算符,比较运算符及下标运算符

重载,在一个类定义中,可以编写几个同名的方法,但是只要它们的签名参数列表不同,Java就会将它们看做唯一的方法。简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法 下面关...

带您走进七周七语言的程序世界

编者按 这是一本2011年Jolt大奖图书,在本文中,截选了七门各不相同的语言的概况,这七门语言,无论教还是学,对我们而言都是一个宏伟目标。书中的代码足以深刻阐释每一门语言的精髓。这七门语言都有非常...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)