📄 sketchview.java
字号:
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 + -