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

📄 sketchview.java

📁 非常好的java事例以及带源码事例的java2教程
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import javax.swing.*;
import java.util.*;                 // For Observer
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;            // For events
import javax.swing.event.*;         // For mouse input adapter
import java.awt.print.*;

class SketchView extends    JComponent
                 implements Observer, Constants, ActionListener, Printable, Pageable
{
  public SketchView(Sketcher theApp)
  {
    this.theApp = theApp;
    MouseHandler handler = new MouseHandler();         // create the mouse listener
    addMouseListener(handler);                         // Listen for button events
    addMouseMotionListener(handler);                   // Listen for motion events

    // Add the pop-up menu items
    moveItem = elementPopup.add("Move");
    deleteItem = elementPopup.add("Delete");
    rotateItem = elementPopup.add("Rotate");
    sendToBackItem = elementPopup.add("Send-to-back");

    // Add the menu item listeners
    moveItem.addActionListener(this);
    deleteItem.addActionListener(this);
    rotateItem.addActionListener(this);
    sendToBackItem.addActionListener(this);
  }

  // Always two pages
  public int getNumberOfPages()
  {
    return 2;
  }

  // Return the Printable object that will render the page
  public Printable getPrintable(int pageIndex)
  {
    return this;
  }
  
  public PageFormat getPageFormat(int pageIndex)
  {
    // Get the default page format and its Paper object.
    PageFormat pageFormat = PrinterJob.getPrinterJob().defaultPage();
    Paper paper = pageFormat.getPaper();                          
    
    if(pageIndex == 0)                               // If it's the cover page
    {
      // make the margins twice the size
      double leftMargin = paper.getImageableX();     // Top left corner is indented
      double topMargin = paper.getImageableY();      // by the left and top margins

      // Get right and bottom margins
      double rightMargin = paper.getWidth()-paper.getImageableWidth()-leftMargin;
      double bottomMargin = paper.getHeight()-paper.getImageableHeight()-topMargin;

      // Double the margin sizes
      leftMargin *= 2;
      rightMargin *= 2;
      topMargin *= 2;
      bottomMargin *= 2;

      paper.setImageableArea(leftMargin, topMargin,       // Set new printable area
                            paper.getWidth()-leftMargin-rightMargin,
                            paper.getHeight()-topMargin-bottomMargin);
      pageFormat.setPaper(paper);                         // Restore the paper
    }

    return pageFormat;                                    // Return the page format
  }

  public int print(Graphics g,                       // Graphics context for printing
                   PageFormat pageFormat,            // The page format
                   int pageIndex)                    // Index number of current page
                   throws PrinterException
  {
    if(pageIndex > 1)
      return NO_SUCH_PAGE;
    Graphics2D g2D = (Graphics2D) g;

    if(pageIndex == 0)
    { // Print the cover page
      float x = (float)pageFormat.getImageableX();
      float y = (float)pageFormat.getImageableY();

      GeneralPath path = new GeneralPath();
      path.moveTo(x+1, y+1);
      path.lineTo(x+(float)pageFormat.getImageableWidth()-1, y+1);
      path.lineTo(x+(float)pageFormat.getImageableWidth()-1,
                                      y+(float)pageFormat.getImageableHeight()-1);
      path.lineTo(x+1, y+(float)pageFormat.getImageableHeight()-1);
      path.closePath();

      g2D.setPaint(Color.red);
      g2D.draw(path);

      // Get a 12 pt bold version of the default font
      Font font = g2D.getFont().deriveFont(12.f).deriveFont(Font.BOLD);

      g2D.setFont(font);                    // Set the new font
      String sketchName = theApp.getWindow().getSketchName();
      Rectangle textRect = (Rectangle)font.getStringBounds(
                                          sketchName, g2D.getFontRenderContext());
      double centerX = pageFormat.getWidth()/2;
      double centerY = pageFormat.getHeight()/2;
      Rectangle2D.Double surround = new Rectangle2D.Double(
                                             centerX-textRect.width,
                                             centerY-textRect.height,
                                             2*textRect.width,
                                             2*textRect.height);
      g2D.draw(surround);

      // draw text in the middle of the printable area
      g2D.setPaint(Color.blue);
      g2D.drawString(sketchName, (float)(centerX-textRect.width/2),
                                 (float)(centerY+textRect.height/2));
      return PAGE_EXISTS;
    }

    Rectangle rect = getModelExtent();             // Get sketch bounds

    // If the width is more than the height, set landscape
    if(rect.width > rect.height)
      pageFormat.setOrientation(pageFormat.LANDSCAPE);

    // Calculate the scale to fit sketch to page
    double scaleX = pageFormat.getImageableWidth()/rect.width;
    double scaleY = pageFormat.getImageableHeight()/rect.height;
    double scale = Math.min(scaleX, scaleY);        // Get minimum scale factor

    // Move origin to page printing area corner
    g2D.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    g2D.scale(scale, scale);                        // Apply scale factor
    g2D.translate(-rect.x, -rect.y);                // Move origin to rect top left

    // Adjust for landscape printing if necessary
    if(rect.width > rect.height)
      g2D.transform(new AffineTransform(0, 1, -1, 0, rect.height, 0));

    paint(g2D);
    return PAGE_EXISTS;
  }

  public void paint(Graphics g)
  {
    Graphics2D g2D = (Graphics2D)g;                     // Get a 2D device context
    Iterator elements = theApp.getModel().getIterator();
    Element element;                                    // Stores an element

    while(elements.hasNext())                           // Go through the list
    {
      element = (Element)elements.next();               // Get the next element
      element.draw(g2D);                                // Draw its shape
    }
  }

  // Method called by Observable object when it changes
  public void update(Observable o, Object rectangle)
  {
    if(rectangle == null)
      repaint();
    else
      repaint((Rectangle)rectangle);
  }

  // Get the rectangle enclosing an entire sketch
  Rectangle getModelExtent()
  {
    Iterator elements = theApp.getModel().getIterator();
    Rectangle rect = new Rectangle();                   // An empty rectangle
    Element element;                                    // Stores an element
    while(elements.hasNext())                           // Go through the list
    {
      element = (Element)elements.next();               // Get the next element
      rect.add(element.getBounds());                    // Expand union
    }
    if(rect.width == 0)                                 // Make sure width
      rect.width = 1;                                   // is non-zero
    if(rect.height == 0)                                // and the height
      rect. height = 1;
    return rect;
  }

  private Element highlightElement;                                    // Highlighted element
  private JPopupMenu elementPopup = new JPopupMenu("Element");
  private JMenuItem moveItem, deleteItem,rotateItem, sendToBackItem;
  private Sketcher theApp;                                             // The application object
  private int mode = NORMAL;
  private Element selectedElement;

  class MouseHandler extends MouseInputAdapter
  {
    public void mousePressed(MouseEvent e)
    {
      start = e.getPoint();                    // Save cursor position
      int modifier = e.getModifiers();         // Get modifiers

      if((modifier & e.BUTTON1_MASK) != 0)
      {
            g2D = (Graphics2D)getGraphics();                 // Get graphics context
            g2D.setXORMode(getBackground());                 // Set XOR mode
            g2D.setPaint(theApp.getWindow().getElementColor()); // Set color
      }
    }

    public void mouseDragged(MouseEvent e)
    {
      last = e.getPoint();                              // Save cursor position
      int modifier = e.getModifiers();                  // Get modifiers

      if((modifier & e.BUTTON1_MASK) != 0 && 
         (theApp.getWindow().getElementType() != TEXT) &&
          (mode == NORMAL))
      {
        if(tempElement == null)                         // Is there an element?
          tempElement = createElement(start, last);     // No so create one
        else
        {
          tempElement.draw(g2D);                        // Yes - draw to erase it
          tempElement.modify(start, last);              // Modify it
        }

⌨️ 快捷键说明

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