mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 12:09:14 +00:00
301 lines
8.8 KiB
Java
301 lines
8.8 KiB
Java
/*
|
|
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* - Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* - Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* - Neither the name of Oracle nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/*
|
|
* This source code is provided to illustrate the usage of a given feature
|
|
* or technique and has been deliberately simplified. Additional steps
|
|
* required for a production-quality application, such as security checks,
|
|
* input validation and proper error handling, might not be present in
|
|
* this sample code.
|
|
*/
|
|
|
|
|
|
|
|
import java.applet.Applet;
|
|
import java.awt.BorderLayout;
|
|
import java.awt.Checkbox;
|
|
import java.awt.CheckboxGroup;
|
|
import java.awt.Choice;
|
|
import java.awt.Color;
|
|
import java.awt.Component;
|
|
import java.awt.Dimension;
|
|
import java.awt.FlowLayout;
|
|
import java.awt.Frame;
|
|
import java.awt.Graphics;
|
|
import java.awt.Panel;
|
|
import java.awt.Point;
|
|
import java.awt.Rectangle;
|
|
import java.awt.event.ItemEvent;
|
|
import java.awt.event.ItemListener;
|
|
import java.awt.event.MouseEvent;
|
|
import java.awt.event.MouseListener;
|
|
import java.awt.event.MouseMotionListener;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
|
|
@SuppressWarnings("serial")
|
|
public class DrawTest extends Applet {
|
|
|
|
DrawPanel panel;
|
|
DrawControls controls;
|
|
|
|
@Override
|
|
public void init() {
|
|
setLayout(new BorderLayout());
|
|
panel = new DrawPanel();
|
|
controls = new DrawControls(panel);
|
|
add("Center", panel);
|
|
add("South", controls);
|
|
}
|
|
|
|
@Override
|
|
public void destroy() {
|
|
remove(panel);
|
|
remove(controls);
|
|
}
|
|
|
|
public static void main(String args[]) {
|
|
Frame f = new Frame("DrawTest");
|
|
DrawTest drawTest = new DrawTest();
|
|
drawTest.init();
|
|
drawTest.start();
|
|
|
|
f.add("Center", drawTest);
|
|
f.setSize(300, 300);
|
|
f.setVisible(true);
|
|
}
|
|
|
|
@Override
|
|
public String getAppletInfo() {
|
|
return "A simple drawing program.";
|
|
}
|
|
}
|
|
|
|
|
|
@SuppressWarnings("serial")
|
|
class DrawPanel extends Panel implements MouseListener, MouseMotionListener {
|
|
|
|
public static final int LINES = 0;
|
|
public static final int POINTS = 1;
|
|
int mode = LINES;
|
|
List<Rectangle> lines = new ArrayList<Rectangle>();
|
|
List<Color> colors = new ArrayList<Color>();
|
|
int x1, y1;
|
|
int x2, y2;
|
|
|
|
@SuppressWarnings("LeakingThisInConstructor")
|
|
public DrawPanel() {
|
|
setBackground(Color.white);
|
|
addMouseMotionListener(this);
|
|
addMouseListener(this);
|
|
}
|
|
|
|
public void setDrawMode(int mode) {
|
|
switch (mode) {
|
|
case LINES:
|
|
case POINTS:
|
|
this.mode = mode;
|
|
break;
|
|
default:
|
|
throw new IllegalArgumentException();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void mouseDragged(MouseEvent e) {
|
|
e.consume();
|
|
switch (mode) {
|
|
case LINES:
|
|
x2 = e.getX();
|
|
y2 = e.getY();
|
|
break;
|
|
case POINTS:
|
|
default:
|
|
colors.add(getForeground());
|
|
lines.add(new Rectangle(x1, y1, e.getX(), e.getY()));
|
|
x1 = e.getX();
|
|
y1 = e.getY();
|
|
break;
|
|
}
|
|
repaint();
|
|
}
|
|
|
|
@Override
|
|
public void mouseMoved(MouseEvent e) {
|
|
}
|
|
|
|
@Override
|
|
public void mousePressed(MouseEvent e) {
|
|
e.consume();
|
|
switch (mode) {
|
|
case LINES:
|
|
x1 = e.getX();
|
|
y1 = e.getY();
|
|
x2 = -1;
|
|
break;
|
|
case POINTS:
|
|
default:
|
|
colors.add(getForeground());
|
|
lines.add(new Rectangle(e.getX(), e.getY(), -1, -1));
|
|
x1 = e.getX();
|
|
y1 = e.getY();
|
|
repaint();
|
|
break;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void mouseReleased(MouseEvent e) {
|
|
e.consume();
|
|
switch (mode) {
|
|
case LINES:
|
|
colors.add(getForeground());
|
|
lines.add(new Rectangle(x1, y1, e.getX(), e.getY()));
|
|
x2 = -1;
|
|
break;
|
|
case POINTS:
|
|
default:
|
|
break;
|
|
}
|
|
repaint();
|
|
}
|
|
|
|
@Override
|
|
public void mouseEntered(MouseEvent e) {
|
|
}
|
|
|
|
@Override
|
|
public void mouseExited(MouseEvent e) {
|
|
}
|
|
|
|
@Override
|
|
public void mouseClicked(MouseEvent e) {
|
|
}
|
|
|
|
@Override
|
|
public void paint(Graphics g) {
|
|
int np = lines.size();
|
|
|
|
/* draw the current lines */
|
|
g.setColor(getForeground());
|
|
for (int i = 0; i < np; i++) {
|
|
Rectangle p = lines.get(i);
|
|
g.setColor(colors.get(i));
|
|
if (p.width != -1) {
|
|
g.drawLine(p.x, p.y, p.width, p.height);
|
|
} else {
|
|
g.drawLine(p.x, p.y, p.x, p.y);
|
|
}
|
|
}
|
|
if (mode == LINES) {
|
|
g.setColor(getForeground());
|
|
if (x2 != -1) {
|
|
g.drawLine(x1, y1, x2, y2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@SuppressWarnings("serial")
|
|
class DrawControls extends Panel implements ItemListener {
|
|
|
|
DrawPanel target;
|
|
|
|
@SuppressWarnings("LeakingThisInConstructor")
|
|
public DrawControls(DrawPanel target) {
|
|
this.target = target;
|
|
setLayout(new FlowLayout());
|
|
setBackground(Color.lightGray);
|
|
target.setForeground(Color.red);
|
|
CheckboxGroup group = new CheckboxGroup();
|
|
Checkbox b;
|
|
add(b = new Checkbox(null, group, false));
|
|
b.addItemListener(this);
|
|
b.setForeground(Color.red);
|
|
add(b = new Checkbox(null, group, false));
|
|
b.addItemListener(this);
|
|
b.setForeground(Color.green);
|
|
add(b = new Checkbox(null, group, false));
|
|
b.addItemListener(this);
|
|
b.setForeground(Color.blue);
|
|
add(b = new Checkbox(null, group, false));
|
|
b.addItemListener(this);
|
|
b.setForeground(Color.pink);
|
|
add(b = new Checkbox(null, group, false));
|
|
b.addItemListener(this);
|
|
b.setForeground(Color.orange);
|
|
add(b = new Checkbox(null, group, true));
|
|
b.addItemListener(this);
|
|
b.setForeground(Color.black);
|
|
target.setForeground(b.getForeground());
|
|
Choice shapes = new Choice();
|
|
shapes.addItemListener(this);
|
|
shapes.addItem("Lines");
|
|
shapes.addItem("Points");
|
|
shapes.setBackground(Color.lightGray);
|
|
add(shapes);
|
|
}
|
|
|
|
@Override
|
|
public void paint(Graphics g) {
|
|
Rectangle r = getBounds();
|
|
g.setColor(Color.lightGray);
|
|
g.draw3DRect(0, 0, r.width, r.height, false);
|
|
|
|
int n = getComponentCount();
|
|
for (int i = 0; i < n; i++) {
|
|
Component comp = getComponent(i);
|
|
if (comp instanceof Checkbox) {
|
|
Point loc = comp.getLocation();
|
|
Dimension d = comp.getSize();
|
|
g.setColor(comp.getForeground());
|
|
g.drawRect(loc.x - 1, loc.y - 1, d.width + 1, d.height + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void itemStateChanged(ItemEvent e) {
|
|
if (e.getSource() instanceof Checkbox) {
|
|
target.setForeground(((Component) e.getSource()).getForeground());
|
|
} else if (e.getSource() instanceof Choice) {
|
|
String choice = (String) e.getItem();
|
|
if (choice.equals("Lines")) {
|
|
target.setDrawMode(DrawPanel.LINES);
|
|
} else if (choice.equals("Points")) {
|
|
target.setDrawMode(DrawPanel.POINTS);
|
|
}
|
|
}
|
|
}
|
|
}
|