import javax.swing.*; |
import java.awt.image.*; |
import java.awt.datatransfer.*; |
import javax.swing.*; |
import java.awt.*; |
import java.awt.event.*; |
import java.awt.image.*; //....................... |
import java.io.*; |
import java.awt.dnd.*; //................... |
import javax.imageio.*; //.............. |
import java.util.Iterator; |
import java.lang.Iterable; |
import java.util.List; |
//JFrame(窗口)<JMenuBar(菜单条)<JMenu(菜单)<JMenuItem(菜单里的项目) |
//JFrame(窗口)<JScrollPane(滚动条)<JTextArea(文件编辑面板)<JPopupMenu(右键菜单) |
//JFrame(窗口)<JScrollPane(滚动条)<JLabel(标签) |
//JFrame(窗口)<JPanel(板面)<JTextField(文件编辑条) |
//JFrame(窗口)<JPanel(板面)<JButton(按钮) |
//JFrame(窗口)<JPanel(板面)<JRadioButton(单选按钮,用ButtonGroup组合) |
//JFrame(窗口)<JPanel(板面)<JCheckBox(复选框) |
//JFrame(窗口)<JPanel(板面)<JComboBox(下拉选择框) |
//JFrame(窗口)<Box(布局管理器) |
public class HandDraw |
{ |
//画图区的宽度 |
private final int AREA_WIDTH= 500 ; |
//画图区的高度 |
private final int AREA_HEIGHT= 400 ; |
//下面的变量保存上一次鼠标拖动事件的鼠标坐标 |
private int preX = - 1 ; |
private int preY = - 1 ; |
//定义右键菜单用于设置画笔颜色 |
JPopupMenu pop= new JPopupMenu(); //右键菜单 |
JMenuItem chooseColor = new JMenuItem( "选择颜色" ); |
//定义 一个BufferedImage对象.......绘制位图..................................................... |
//图像是先画在BufferedImage上的,再加到DrawCanvas中------------------------ |
BufferedImage image= new BufferedImage(AREA_WIDTH,AREA_HEIGHT,BufferedImage.TYPE_INT_RGB); |
//获取image对象的Graphics(Graphics翻译:制图法、制图学、图表算法) |
Graphics g=image.getGraphics(); // |
//.......................................................................................... |
private JFrame f = new JFrame( "简单手绘板" ); |
private DrawCanvas drawArea= new DrawCanvas(); //画布 |
//用于保存画笔颜色,默认是红色 |
private Color foreColor = new Color( 255 , 0 , 0 ); |
//............................................................................. |
public void init(){ |
|
chooseColor.addActionListener( new ActionListener(){ |
public void actionPerformed(ActionEvent ae){ |
//弹出一个非模式的颜色选择 ---对话框JDialog--- |
//并可以分别为“确定”按钮,“取消”按钮指定事件监听器---------------------------- |
//颜色选择器,系统全准备好了(按钮都准备了)---------------------------- |
final JColorChooser colorPane = new JColorChooser(foreColor); |
//《疯狂java讲义》P483 createDialog()方法-------------------------------------- |
JDialog jd = JColorChooser.createDialog(f, "选择画笔颜色" , false ,colorPane, |
//非模式//颜色选择器 |
//“确定”按钮的位置,为它设置事件监听器------------------------------------ |
new ActionListener(){ |
public void actionPerformed(ActionEvent ae){ |
foreColor = colorPane.getColor(); |
} |
}, null ); //“取消”按钮的位置----------------------------------------------------- |
jd.setVisible( true ); |
} |
}); |
//将菜单项组合成右键菜单--------------------------------------------------------------- |
pop.add(chooseColor); |
//将右键菜单添加到drawArea对象中----相当于鼠标右键监听器------------------------------ |
//--------------卡在这里半天原来是DrawCanvas的继承关系变了DrawCanvas extends JPanel--------------- |
//---------------------------之前是继承Canvas,现在是JPanel----------------------------- |
drawArea.setComponentPopupMenu(pop); |
//drawArea.add(pop); |
//将image对象背景色填充成白色 |
g.fillRect( 0 , 0 ,AREA_WIDTH,AREA_HEIGHT); |
//这是画布的大小。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 |
drawArea.setPreferredSize( new Dimension(AREA_WIDTH,AREA_HEIGHT)); |
//监听鼠标移动 (Motion左键) 动作。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 |
drawArea.addMouseMotionListener( new MouseMotionAdapter(){ |
//实现 按下鼠标并拖动的 事件处理器。。。。。。。。。。。。。。 |
public void mouseDragged(MouseEvent e){ |
//如果preX和preY大于0 |
if (preX > 0 && preY > 0 ){ |
//设置当前颜色 |
g.setColor(foreColor); |
//绘制 从上一次鼠标拖动事件点到本次鼠标拖动事件点的 线段 |
g.drawLine(preX,preY,e.getX(),e.getY()); |
} |
//将当前鼠标事件点的X,Y坐标保存起来 |
preX = e.getX(); |
preY = e.getY(); |
//重绘darwArea对象 |
drawArea.repaint(); |
} |
}); |
|
//监听鼠标事件(没有Motion)(右键)。。。。。。。。。上面是监听鼠标移动。。。。。。。。。。。。 |
drawArea.addMouseListener( new MouseAdapter(){ |
//实现 鼠标键松开 的事件处理器。。。。。。。。。。。。。。。。。。。。。。。。 |
public void mouseReleased(MouseEvent e){ |
|
//松开鼠标键时,把上一次鼠标拖动事件点的X,Y坐标设为-1 |
preX = - 1 ; |
preY = - 1 ; |
} |
}); |
//此代码在swing中相当于鼠标右键监听器---------------------------------------------------- |
//new JTextArea().setComponentPopupMenu(pop); |
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
f.add(drawArea); |
f.pack(); |
f.setVisible( true ); |
} |
//主程序入口 |
public static void main(String[] args){ |
new HandDraw().init(); |
} |
//内部类 |
class DrawCanvas extends JPanel //------------------------------------------------ |
{ |
//重写JPanel的paint方法,实现绘画 |
public void paint(Graphics g){ |
//将image绘制到该组件上 |
g.drawImage(image, 0 , 0 , null ); |
} |
} |
} |
初级程序员
by: 菜鸟慢飞 发表于:2018-09-13 08:55:10 顶(0) | 踩(0) 回复
学习一下
回复评论