📄 scribble.java
字号:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
// ColorDescription 类存储 Color 以及它的描述.
// 提供这个类完全是为了方便把一个Color对象和一个String对象关联起来
class ColorDescription
{
// associates a Color with a text String, declared public for convenience
public Color color;
public String text;
public ColorDescription(Color c, String s)
{
color = c;
text = s;
}
public boolean matches(String s)
{
return text.equals(s);
}
} // ColorDescription
// Scribble applet 让用户可以使用鼠标描绘点和线
// 它还可以改变当前画笔的颜色.
public class Scribble extends Applet implements ItemListener, ActionListener,
MouseListener, MouseMotionListener
{
private Choice colorChooser; // 储存颜色的下拉框
private Color currentColor; // 当前的画笔颜色
// 一个 Color和关联字符名字的数组
// 你所需要做的只是编辑这个列表来增加或者删除选项
private final ColorDescription[] colors = new ColorDescription[] {
new ColorDescription(Color.BLACK, "Black"),
new ColorDescription(Color.RED, "Red"),
new ColorDescription(Color.GREEN, "Green"),
new ColorDescription(Color.BLUE, "Blue"),
new ColorDescription(Color.YELLOW, "Yellow"),
new ColorDescription(Color.ORANGE, "Orange"),
new ColorDescription(Color.GRAY, "Gray"),
new ColorDescription(Color.CYAN, "Cyan")
};
// 所绘制线条的起点和终点
private Point p1;
private Point p2;
// 覆盖 Applet 类的init方法
public void init()
{
p1 = null;
p2 = null;
setBackground(Color.WHITE);
// 记着注册自己来接收鼠标事件
addMouseListener(this);
addMouseMotionListener(this);
// 把光标改得时髦点
setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
currentColor = colors[0].color;
// 创建一个包含applet命令的 "sidebar"
createSidebar();
}
//覆盖Applet类的destroy方法
public void destroy()
{
// 释放applet生命周期中的所有监听器
removeMouseListener(this);
removeMouseMotionListener(this);
colorChooser.removeItemListener(this);
}
// 创建一个Frame,它包含颜色选项下拉框 和一个清除applet窗体的按钮
private void createSidebar()
{
// 对于颜色数组中的每一个 ColorDescription ,提取其文本
// 并将它加入选项列表
colorChooser = new Choice();
for(int i = 0; i < colors.length; i++)
{
colorChooser.add(colors[i].text);
}
colorChooser.addItemListener(this);
// 创建 "clear window" 按钮
Button b = new Button("Clear Window");
b.addActionListener(this);
// 创建 frame
Frame f = new Frame();
f.setLocation(getX() + getSize().width + 8, getY());
f.setLayout(new GridLayout(3, 1, 5, 5));
f.setBackground(Color.YELLOW);
f.add(new Label("Pen Color:", Label.CENTER));
f.add(colorChooser);
f.add(b);
f.pack();
f.show();
}
// 使用当前画笔颜色绘制连接 p1 和 p2 的点
private void drawPoints()
{
Graphics g = getGraphics();
g.setColor(currentColor);
g.drawLine(p1.x, p1.y, p2.x, p2.y);
}
// 在 sidebar上的 "clear window" 按钮被点击时调用
public void actionPerformed(ActionEvent e)
{
repaint();
}
// 在下拉框改变时调用
public void itemStateChanged(ItemEvent e)
{
String color = colorChooser.getSelectedItem();
// 用当前的选项匹配画笔颜色
for(int i = 0; i < colors.length; i++)
{
if(colors[i].matches(color))
{
// 设置颜色
currentColor = colors[i].color;
break;
}
}
}
/** 实现MouseMotionListener接口中的方法 */
public void mouseMoved(MouseEvent e)
{
// 什么也不做...
}
public void mouseDragged(MouseEvent e)
{
// 如果点还没有设置的话,进行设置
if(p1 == null)
{
p1 = new Point(e.getX(), e.getY());
}
if(p2 == null)
{
p2 = new Point(e.getX(), e.getY());
}
// 更新并绘制点
p1.x = p2.x;
p1.y = p2.y;
p2.x = e.getX();
p2.y = e.getY();
drawPoints();
}
/** 实现 MouseListener 接口中的方法 */
public void mouseClicked(MouseEvent e)
{
// 什么也不做...
}
public void mouseEntered(MouseEvent e)
{
// 什么也不做...
}
public void mouseExited(MouseEvent e)
{
// 什么也不做...
}
// 允许点在鼠标按钮按下时绘制,而鼠标不必在拖拽中
public void mousePressed(MouseEvent e)
{
mouseDragged(e);
}
// 释放点,允许不连续的绘制
public void mouseReleased(MouseEvent e)
{
p1 = null;
p2 = null;
}
} // Scribble
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -