📄 painter.java
字号:
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.lang.Math;
import javax.imageio.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.image.*;
import java.awt.event.*;
import java.awt.Graphics;
public class Painter extends Frame implements ActionListener, MouseListener, MouseMotionListener, ItemListener
{
Point dot[] = new Point[1000];
Point start = new Point(0, 0);
Point end = new Point(0, 0);
int dots = 0;
private BufferedImage bufferedImage, tileImage;
private Image image;
private int imageWidth = 300;
private int imageHeight = 300;
private int offsetX = 50;
private int offsetY = 60;
private Color color = new Color(0, 0, 0);
Menu menu1, menu2, menu3;
MenuBar menubar;
MenuItem openMenuItem, saveMenuItem, colorMenuItem, newMenuItem,
exitMenuItem;
CheckboxMenuItem linesMenuItem, ellipsesMenuItem,
rectanglesMenuItem, roundedMenuItem, freehandMenuItem,
solidMenuItem, gradientMenuItem, textureMenuItem,
transparentMenuItem, textMenuItem, thickMenuItem,
plainMenuItem, shadowMenuItem;
FileDialog dialog;
private String drawText = "";
boolean mouseUp = false;
boolean dragging = false;
boolean draw = false;
boolean line = false;
boolean ellipse = false;
boolean rectangle = false;
boolean rounded = false;
boolean text = false;
boolean solid = false;
boolean shade = false;
boolean transparent = false;
boolean texture = false;
boolean red = false;
boolean green = false;
boolean blue = false;
boolean thick = false;
boolean adjusted = false;
boolean shadow = false;
OkCancelDialog textDialog;
public static void main(String[] args)
{
new Painter();
}
public Painter()
{
setLayout(null);
addMouseListener(this);
addMouseMotionListener(this);
menubar = new MenuBar();
menu1 = new Menu("File");
menu2 = new Menu("Draw");
menu3 = new Menu("Effects");
newMenuItem = new MenuItem("New");
menu1.add(newMenuItem);
newMenuItem.addActionListener(this);
openMenuItem = new MenuItem("Open...");
menu1.add(openMenuItem);
openMenuItem.addActionListener(this);
saveMenuItem = new MenuItem("Save As...");
menu1.add(saveMenuItem);
saveMenuItem.addActionListener(this);
linesMenuItem = new CheckboxMenuItem("Draw lines");
menu2.add(linesMenuItem);
linesMenuItem.addItemListener(this);
ellipsesMenuItem = new CheckboxMenuItem("Draw ellipses");
menu2.add(ellipsesMenuItem);
ellipsesMenuItem.addItemListener(this);
rectanglesMenuItem = new CheckboxMenuItem("Draw rectangles");
menu2.add(rectanglesMenuItem);
rectanglesMenuItem.addItemListener(this);
roundedMenuItem = new CheckboxMenuItem(
"Draw rounded rectangles");
menu2.add(roundedMenuItem);
roundedMenuItem.addItemListener(this);
freehandMenuItem = new CheckboxMenuItem("Draw freehand");
menu2.add(freehandMenuItem);
freehandMenuItem.addItemListener(this);
plainMenuItem = new CheckboxMenuItem("Plain");
menu3.add(plainMenuItem);
plainMenuItem.addItemListener(this);
solidMenuItem = new CheckboxMenuItem("Solid fill");
menu3.add(solidMenuItem);
solidMenuItem.addItemListener(this);
gradientMenuItem = new CheckboxMenuItem("Gradient fill");
menu3.add(gradientMenuItem);
gradientMenuItem.addItemListener(this);
textureMenuItem = new CheckboxMenuItem("Texture fill");
menu3.add(textureMenuItem);
textureMenuItem.addItemListener(this);
transparentMenuItem = new CheckboxMenuItem("Transparent");
menu3.add(transparentMenuItem);
transparentMenuItem.addItemListener(this);
textMenuItem = new CheckboxMenuItem("Draw text");
menu2.add(textMenuItem);
textMenuItem.addItemListener(this);
thickMenuItem = new CheckboxMenuItem("Draw thick lines");
menu3.add(thickMenuItem);
thickMenuItem.addItemListener(this);
shadowMenuItem = new CheckboxMenuItem("Drop shadow");
menu3.add(shadowMenuItem);
shadowMenuItem.addItemListener(this);
colorMenuItem = new MenuItem("Select color...");
menu3.add(colorMenuItem);
colorMenuItem.addActionListener(this);
exitMenuItem = new MenuItem("Exit");
menu1.add(exitMenuItem);
exitMenuItem.addActionListener(this);
menubar.add(menu1);
menubar.add(menu2);
menubar.add(menu3);
setMenuBar(menubar);
dialog = new FileDialog(this, "File Dialog");
bufferedImage = new BufferedImage (imageWidth, imageHeight,
BufferedImage.TYPE_INT_BGR );
setSize(400, 400);
setTitle("Painter");
setVisible(true);
image = createImage(imageWidth, imageHeight);
textDialog = new OkCancelDialog(this, "Enter your text", true);
try{
File inputFile = new File("tile.jpg");
tileImage = ImageIO.read(inputFile);
} catch (java.io.IOException ioe){
System.out.println("Need tile.jpg.");
System.exit(0);
}
this.addWindowListener(new WindowAdapter(){
public void windowClosing(
WindowEvent e){
System.exit(0);
}
}
);
}
public void mousePressed(MouseEvent e)
{
mouseUp = false;
start = new Point(e.getX(), e.getY());
adjusted=true;
repaint();
}
public void mouseReleased(MouseEvent e)
{
if(rounded || line || ellipse || rectangle || draw || text){
end = new Point(e.getX(), e.getY());
mouseUp = true;
dragging = false;
adjusted=false;
repaint();
}
}
public void mouseDragged(MouseEvent e)
{
dragging = true;
if(new Rectangle(offsetX, offsetY,
imageWidth, imageHeight).contains(e.getX(), e.getY())){
if(draw){
dot[dots] = new Point(e.getX(), e.getY());
dots++;
}
}
if(new Rectangle(offsetX, offsetY,
imageWidth, imageHeight).contains(start.x, start.y)){
end = new Point(e.getX(), e.getY());
repaint();
}
}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
public void paint (Graphics g)
{
Graphics2D gImage;
Paint paint;
Composite composite;
if(!dragging && !adjusted){
if(image == null){
image = createImage(imageWidth, imageHeight);
}
gImage = (Graphics2D) image.getGraphics();
}
else{
gImage = (Graphics2D) g;
g.drawImage(image, offsetX, offsetY, this);
g.drawRect(offsetX, offsetY, imageWidth, imageHeight);
gImage.clip(new Rectangle2D.Double(offsetX, offsetY,
imageWidth, imageHeight));
}
composite = gImage.getComposite();
if(color != null){
gImage.setColor(color);
} else {
gImage.setColor(new Color(0, 0, 0));
}
if(thick){
gImage.setStroke(new BasicStroke(10));
} else{
gImage.setStroke(new BasicStroke(1));
}
if (mouseUp || dragging) {
Point tempStart, tempEnd;
tempStart = new Point(Math.min(end.x, start.x),
Math.min(end.y, start.y));
tempEnd = new Point(Math.max(end.x, start.x),
Math.max(end.y, start.y));
tempStart = new Point(Math.max(tempStart.x, offsetX),
Math.max(tempStart.y, offsetY));
tempEnd = new Point(Math.max(tempEnd.x, offsetX),
Math.max(tempEnd.y, offsetY));
tempStart = new Point(Math.min(tempStart.x,
bufferedImage.getWidth() + offsetX),
Math.min(tempStart.y, bufferedImage.getHeight() +
offsetY));
tempEnd = new Point(Math.min(tempEnd.x,
bufferedImage.getWidth() + offsetX),
Math.min(tempEnd.y, bufferedImage.getHeight() +
offsetY));
if(!adjusted){
tempEnd.x -= offsetX;
tempEnd.y -= offsetY;
tempStart.x -= offsetX;
tempStart.y -= offsetY;
end.x -= offsetX;
end.y -= offsetY;
start.x -= offsetX;
start.y -= offsetY;
adjusted=true;
}
int width = tempEnd.x - tempStart.x;
int height = tempEnd.y - tempStart.y;
if(line){
Line2D.Double drawLine = new Line2D.Double(start.x,
start.y, end.x, end.y);
if(shadow){
paint = gImage.getPaint();
composite = gImage.getComposite();
gImage.setPaint(Color.black);
gImage.setComposite(AlphaComposite.getInstance
(AlphaComposite.SRC_OVER, 0.3f));
Line2D.Double line2 =
new Line2D.Double(start.x + 9, start.y + 9,
end.x + 9, end.y + 9);
gImage.draw(line2);
gImage.setPaint(paint);
gImage.setComposite(composite);
}
gImage.draw(drawLine);
}
if(ellipse && width != 0 && height != 0){
Ellipse2D.Double ellipse =
new Ellipse2D.Double(tempStart.x, tempStart.y,
width, height);
if(shadow){
paint = gImage.getPaint();
composite = gImage.getComposite();
gImage.setPaint(Color.black);
gImage.setComposite(AlphaComposite.getInstance
(AlphaComposite.SRC_OVER, 0.3f));
Ellipse2D.Double ellipse2 =
new Ellipse2D.Double(tempStart.x + 9,
tempStart.y + 9, width, height);
if(solid || shade || transparent || texture){
gImage.fill(ellipse2);
}
else{
gImage.draw(ellipse2);
}
gImage.setPaint(paint);
gImage.setComposite(composite);
}
if(solid){
gImage.setPaint(color);
}
if(shade){
gImage.setPaint(
new GradientPaint(
tempStart.x, tempStart.y, color,
tempEnd.x, tempEnd.y, Color.black));
}
if(texture){
Rectangle2D.Double anchor =
new Rectangle2D.Double(0,0,tileImage.getWidth(),
tileImage.getHeight());
TexturePaint texturePaint =
new TexturePaint(tileImage,anchor);
gImage.setPaint(texturePaint);
}
if(transparent){
gImage.setComposite(AlphaComposite.getInstance
(AlphaComposite.SRC_OVER,0.3f));
}
if(solid || shade || transparent || texture){
gImage.fill(ellipse);
}
else{
gImage.draw(ellipse);
}
if(transparent){
gImage.setComposite(composite);
}
}
if(rectangle && width != 0 && height != 0){
Rectangle2D.Double rectangle =
new Rectangle2D.Double(tempStart.x, tempStart.y,
width, height);
if(shadow){
paint = gImage.getPaint();
composite = gImage.getComposite();
gImage.setPaint(Color.black);
gImage.setComposite(AlphaComposite.getInstance
(AlphaComposite.SRC_OVER, 0.3f));
Rectangle2D.Double rectangle2 =
new Rectangle2D.Double(tempStart.x + 9,
tempStart.y + 9, width, height);
if(solid || shade || transparent || texture){
gImage.fill(rectangle2);
}
else{
gImage.draw(rectangle2);
}
gImage.setPaint(paint);
gImage.setComposite(composite);
}
if(solid){
gImage.setPaint(color);
}
if(shade){
gImage.setPaint(
new GradientPaint(
tempStart.x, tempStart.y, color,
tempEnd.x, tempEnd.y, Color.black));
}
if(transparent){
gImage.setComposite(AlphaComposite.getInstance
(AlphaComposite.SRC_OVER,0.3f));
}
if(texture){
Rectangle2D.Double anchor =
new Rectangle2D.Double(0,0,
tileImage.getWidth(), tileImage.getHeight());
TexturePaint texturePaint =
new TexturePaint(tileImage,anchor);
gImage.setPaint(texturePaint);
}
if(solid || shade || texture || transparent){
gImage.fill(rectangle);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -