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

📄 sketchview.java

📁 Beginning Java 2, SDK 1.4 Edition Exercise Code samples for this book
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JMenuItem;

import java.util.Observer;                  
import java.util.Observable;                  
import java.util.Iterator;

import java.awt.Graphics;
import java.awt.Graphics2D;                          
import java.awt.Point;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Font;
import java.awt.Component;

import java.awt.event.ActionEvent;    
import java.awt.event.ActionListener;    
import java.awt.event.MouseEvent;    

import java.awt.geom.Line2D;    

import java.awt.font.TextLayout;  

import javax.swing.event.MouseInputAdapter;

import java.awt.print.Printable;
import java.awt.print.PageFormat;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.awt.print.Pageable;
import java.awt.print.Paper;


class SketchView extends JComponent implements Observer, Constants, ActionListener, Printable, Pageable {
  // Always two pages
  public int getNumberOfPages() {
    return 2;
  }

  // Return the Printable object that will render the page
  public Printable getPrintable(int pageIndex) {
    if(pageIndex == 0)                           // For the first page
      return new SketchCoverPage(theApp);        // return the cover page
    else
      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.0;
      rightMargin *= 2.0;
      topMargin *= 2.0;
      bottomMargin *= 2.0;

      // Set new printable area
      paper.setImageableArea(leftMargin, topMargin,
                             paper.getWidth()-leftMargin-rightMargin,
                             paper.getHeight()-topMargin-bottomMargin);

      // Restore the paper
      pageFormat.setPaper(paper);

    } else {                          // We are printing a sketch so decide
                                      // on portrait or landscape
      Rectangle rect = theApp.getModel().getModelExtent();    // Get sketch
                                                              // bounds

      // If the width is more than the height, set landscape
      if(rect.width>rect.height) {
        pageFormat.setOrientation(pageFormat.LANDSCAPE);
      }
    }
    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;

    // Get sketch bounds
    Rectangle rect = theApp.getModel().getModelExtent();

    // Calculate the scale to fit sketch to page
    double scaleX = pageFormat.getImageableWidth()/rect.width;
    double scaleY = pageFormat.getImageableHeight()/rect.height;

    // Get minimum scale factor
    double scale = Math.min(scaleX, scaleY);  

    // Move origin to page printing area corner
    g2D.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

    g2D.scale(scale, scale);              // Apply scale factor
    
    // Move origin to rect top left
    g2D.translate(-rect.x, -rect.y); 

    paint(g2D);
    return PAGE_EXISTS;
  }

  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);

  }

  public void actionPerformed(ActionEvent e ) {
    Object source = e.getSource();
    if(source == moveItem) {
      mode = MOVE;
      selectedElement = highlightElement;

    } else if(source == deleteItem) {
      if(highlightElement != null) {                    // If there's an element
        theApp.getModel().remove(highlightElement);     // then remove it
        highlightElement = null;                        // Remove the reference
      }

    } else if(source == rotateItem) {
      mode = ROTATE;
      selectedElement = highlightElement;

    } else if(source == sendToBackItem) {
      if(highlightElement != null) {
        theApp.getModel().remove(highlightElement);
        theApp.getModel().add(highlightElement);
        highlightElement.setHighlighted(false);
        highlightElement = null;
        repaint();
      }
    }
  }

  public void paint(Graphics g) {
    Graphics2D g2D = (Graphics2D)g;                 // Get a 2D device context
    Iterator elements = theApp.getModel().getIterator();
    while(elements.hasNext())                       // Go through the list
      ((Element)elements.next()).draw(g2D);         // Get the next element to draw 
                                                    // itself
  }

  public void update(Observable o, Object rectangle) {
    if(rectangle == null)
      repaint();
    else
      repaint((Rectangle)rectangle);
  }

  class MouseHandler extends MouseInputAdapter {
    public void mousePressed(MouseEvent e) {
      start = e.getPoint();                   // Save the cursor position in start
      if((button1Down = (e.getButton()==MouseEvent.BUTTON1))) { 
        g2D = (Graphics2D)getGraphics();                 // Get graphics context
        g2D.setXORMode(getBackground());                 // Set XOR mode

⌨️ 快捷键说明

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