关于xp简易画图板程序流程:
1.创建主窗口 设置大小、标题、关闭方式并显示可见
2.指定主窗口布局方式为 边框布局
3.创建左边工具选择面板、中间绘图面板、底部颜色选择面板
设置颜色、大小并将面板加到主窗口中 指定放的位置[东西南北中]
中间绘图面板的实现:
1.创建绘图主面板drawpanel 设置大小、颜色并将drawpanel加到中间面板上
(为了使绘图主面板始终在中间面板上的左上角,指定布局为FlowLayout.LEFT)
2.创建DrawListener监听器 实现MouseListener接口
3.通过构造函数 共享drawpanel
4.创建Graphics对象g g=draw.getGraphics();获取在drawpanel绘图的权限
5.在mousePressed()、mouseReleased()中分别获取坐标
调用函数g.drawLine(x1, y1, x2, y2);就可以画直线
(直线、矩形、椭圆可以调用函数,其他的还没有实现...)
左边工具选择面板的实现:
1.创建单选按钮 加到左边面板上 设置唯一标识
2.创建按钮组对象 所有单选按钮加到按钮组对象中 给单选按钮进行逻辑分组
(其中一个单选按钮设置默认选中(setSelected)防止出现空指针的错误)
3.给按钮添加图片 调用这四个方法 setIcon() setRolloverIcon()
setPressedIcon() setSelectedIcon()
4.在DrawListener监听器中,通过构造函数 共享按钮组对象group
group.getSelection();方法返回被选中的按钮模型
5.model.getActionCommand();获得动作命令
根据动作命令 调用不同方法实现不同的功能
底部颜色选择面板:
1.创建前景色、后景色标签 使用绝对定位布局 设置位置、颜色、可见(setOpaque)
添加到底部面板中
2.创建选色板标签 设置位置、颜色、可见并添加到底部面板中
每个选色板标签添加颜色监听器
3.颜色监听器实现MouseListener接口 通过构造函数 共享前景色、后景色标签
4. e.getSource()获取事件源对象 强制转化为JLabel 获取当前背景颜色
5.e.getButton()获取鼠标是左键还是右键
将当前背景颜色传给前景色标签或者后景色标签
6.DrawListener监听器 通过构造函数 共享前景色标签和后景色标签
从前景色、后景色标签获取到前景色、后景色
7.再通过判断鼠标左键还是右键 把前景色或者后景色赋给g.setColor()中的参数
设置最终在绘板呈现出的颜色
(选色板标签通过鼠标左键或右键将颜色给前景色或后景色标签
通过前景色或后景色标签上的颜色决定了画板上呈现的颜色)
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
public class DrawUI {
public static void main(String[] args) {
JFrame jf=new JFrame();
jf.setSize(600, 500);
jf.setTitle("XP画图板");
jf.setDefaultCloseOperation(3);
//指定窗口布局为边框布局
BorderLayout layout=new BorderLayout();
jf.setLayout(layout);
//添加一个用来绘图的面板
JPanel panelleft=new JPanel();
panelleft.setBackground(Color.blue);
Dimension dimleft=new Dimension(100,1);
panelleft.setPreferredSize(dimleft);
JPanel panelcenter=new JPanel();
panelcenter.setBackground(Color.gray);
//中间组件大小没有意义
// Dimension dimcenter=new Dimension(1,1);
// panelcenter.setPreferredSize(dimcenter);
JPanel panelfoot=new JPanel();
// panelfoot.setBackground(Color.green);
Dimension dimfoot=new Dimension(1,100);
panelfoot.setPreferredSize(dimfoot);
//把面板添加到窗口中,指定放的位置【东西南北中】
jf.add(panelleft,BorderLayout.WEST);
jf.add(panelcenter,BorderLayout.CENTER);
jf.add(panelfoot,BorderLayout.SOUTH);
//*********************给左边的面板添加形状选择工具***********************//
//按钮组对象,给单选按钮进行逻辑分组
ButtonGroup group =new ButtonGroup();
String[] strs = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"line", "11", "rect", "13", "oval", "15" };
for(int i=0;i<16;i++){
JRadioButton button1=new JRadioButton();
panelleft.add(button1);//加在左边面板上
group.add(button1);//添加分组
button1.setActionCommand(strs[i]);//设置唯一标识
button1.setSelected(true);//设置默认选中
//设置按钮的图片
ImageIcon defaultIcon=new ImageIcon("img/draw"+i+".jpg");
button1.setIcon(defaultIcon);
ImageIcon rolloverIcon=new ImageIcon("img/draw"+i+"-1.jpg");
button1.setRolloverIcon(rolloverIcon);
ImageIcon pressedIcon=new ImageIcon("img/draw"+i+"-2.jpg");
button1.setPressedIcon(pressedIcon);
ImageIcon selectedIcon=new ImageIcon("img/draw"+i+"-3.jpg");
button1.setSelectedIcon(selectedIcon);
}
//*****************给中间的面板添加绘图面板***************************//
JPanel drawpanel=new JPanel();
Dimension drawdim=new Dimension(400,300);
drawpanel.setPreferredSize(drawdim);
drawpanel.setBackground(Color.white);
//流式布局是添加在中间面板上的
//面板默认的布局为流式布局
//指定中间面板的布局为流式布局左对齐
FlowLayout drawlayout =new FlowLayout(FlowLayout.LEFT);
panelcenter.setLayout(drawlayout);
panelcenter.add(drawpanel);
//********************给底部的面板添加颜色选择工具***********************//
JLabel frontLabel=new JLabel();
JLabel backLabel=new JLabel();
//使用绝对定位布局
panelfoot.setLayout(null);
//定义frontLabel的位置和大小
frontLabel.setBounds(50, 20,40,60);
backLabel.setBounds(110, 20,40,60);
//设置背景颜色
frontLabel.setBackground(Color.black);
backLabel.setBackground(Color.BLUE);
//是否允许背景色显示出来
frontLabel.setOpaque(true);
backLabel.setOpaque(true);
panelfoot.add(frontLabel);
panelfoot.add(backLabel);
Color[] cs = { Color.BLACK, Color.GRAY, new Color(128, 0, 0),
Color.RED, new Color(255, 128, 0), Color.YELLOW, Color.GREEN,
new Color(0, 128, 255), Color.BLUE, Color.MAGENTA, Color.BLACK,
Color.GRAY, new Color(128, 0, 0), Color.RED,
new Color(255, 128, 0), Color.YELLOW, Color.GREEN,
new Color(0, 128, 255), Color.BLUE, Color.MAGENTA };
ColorListener mlis = new ColorListener(frontLabel, backLabel);
//选色板
for(int i=0;i<20;i++){
JLabel colorLabel=new JLabel();
//给colorLabel添加鼠标监听器
colorLabel.addMouseListener(mlis);
if(i<10){
colorLabel.setBounds(160+30*i,20,25,25);
}
else {
colorLabel.setBounds(160+30*(i-10),50,25,25);
}
colorLabel.setBackground(cs[i]);
colorLabel.setOpaque(true);
panelfoot.add(colorLabel) ;
}
jf.setVisible(true);
//由于是绘制在drawpanel上的,所以只需要给drawpanel添加鼠标监听器
DrawListener listener=new DrawListener(drawpanel, group,frontLabel,backLabel);
//给面板添加鼠标监听器
drawpanel.addMouseListener(listener);
}
}
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class DrawListener implements MouseListener {
private int x1,x2,y1,y2;
private Graphics g;
private JPanel drawpanel;
private ButtonGroup group;
private String str="line";
private Color frontColor = Color.RED;// 要绘制的前景色
private Color backColor = Color.BLUE;// 背景色
private JLabel frontLabel;
private JLabel backLabel;
//通过构造方法实现不同类中私有变量的共享
public DrawListener(JPanel drawpanel1,ButtonGroup group1,JLabel fLabel, JLabel bLabel){
drawpanel=drawpanel1;
group=group1;
frontLabel = fLabel;
backLabel = bLabel;
}
public void mousePressed(MouseEvent e) {
//鼠标按下准备绘制图形的时候先获取能绘制的区域【画布】
//获取drawPanel在屏幕上占据的区域,作为可以改变颜色的区域
g=drawpanel.getGraphics();
// 获得背景色和前景色
frontColor = frontLabel.getBackground();
backColor = backLabel.getBackground();
// 获得鼠标点击的是左键还是右键
int num = e.getButton();
if (num == 1) {
// 获得要绘制的颜色
g.setColor(frontColor);
} else if (num == 3) {
g.setColor(backColor);
}
// 鼠标按下准备绘制的时候来确定要绘制的图形
// 获得被选中的按钮模型
ButtonModel model=group.getSelection();
// 获得动作命令[每一个按钮的唯一标识]
str=model.getActionCommand();
// str=group.getSelection().getActionCommand();
x1=e.getX();
y1=e.getY();
}
public void mouseReleased(MouseEvent e) {
x2=e.getX();
y2=e.getY();
// 绘制图形
if(str.equals("line")){
g.drawLine(x1, y1, x2, y2);
}
else if(str.equals("rect")){
int x=x1<x2?x1:x2;
int y=y1<y2?y1:y2;
int width=x1<x2?x2-x1:x1-x2;
int height=y1<y2?y2-y1:y1-y2;
g.drawRect(x, y, width, height);
}
else if(str.equals("oval")){
int x=x1<x2?x1:x2;
int y=y1<y2?y1:y2;
int width=x1<x2?x2-x1:x1-x2;
int height=y1<y2?y2-y1:y1-y2;
g.drawOval(x, y, width, height);
}
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;
/**
* 颜色选择的监听器
* @author Administrator
*
*/
public class ColorListener implements MouseListener{
private JLabel frontLabel;
private JLabel backLabel;
public ColorListener(JLabel fLabel, JLabel bLabel) {
frontLabel = fLabel;
backLabel = bLabel;
}
public void mouseReleased(MouseEvent e) {
//获得事件源对象:发生事件的组件
//由于监听器是加在JLabel上的,所以事件源对象一定是JLabel
JLabel label=(JLabel)e.getSource();
//获得背景颜色
Color c=label.getBackground();
//获得鼠标是左键还是右键
int num=e.getButton();
if(num==1){
frontLabel.setBackground(c);
}
else if(num==3){
backLabel.setBackground(c);
}
}
public void mousePressed(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
}
}