画笔功能的实现

DrawUI界面类
package Draw;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;

import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

//画图板主窗口
public class DrawUI {
public static void main(String[] args) {
//创建窗体
JFrame jf=new JFrame();
jf.setTitle("XP画图板");
jf.setBounds(100,100,600, 500);

jf.setDefaultCloseOperation(3);


//指定布局为边框布局

BorderLayout layout=new BorderLayout();
jf.setLayout(layout);

JPanel left=new JPanel();
//设置大小
Dimension leftDim=new Dimension(100,1);
left.setPreferredSize(leftDim);
//left.setBackground(Color.blue);
/*
* 1.setPreferredSize需要在使用布局管理器的时候使用,
* 布局管理器会获取空间的preferredsize,因而可以生效。
* 例如borderlayout在north中放入一个panel,panel的高度可以通过这样实现:
* panel.setPreferredSize(new Dimension(0, 100));这样就设置了一个高度为
* 100的panel,宽度随窗口变化。
* */



JPanel center=new JPanel();
center.setBackground(Color.gray);


JPanel  foot=new JPanel();
Dimension footDim=new Dimension(1,100);//设置大小
foot.setPreferredSize(footDim);
//foot.setBackground(Color.red);


jf.add(left,BorderLayout.WEST);
jf.add(foot,BorderLayout.SOUTH);
jf.add(center,BorderLayout.CENTER);

//**************给左边面板添加形状选择工具***************************//
//按钮组对象,给单选按钮进行逻辑分组
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 btn1=new JRadioButton();
left.add(btn1);//加在左边的面板
group.add(btn1);//添加分组
btn1.setActionCommand(strs[i]);//设置唯一标识
btn1.setSelected(true);//设置默认选中

// 设置按钮的图片
ImageIcon defaultIcon = new ImageIcon("image/draw" + i + ".jpg");
btn1.setIcon(defaultIcon);

ImageIcon rolloverIcon = new ImageIcon("image/draw" + i + "-1.jpg");
btn1.setRolloverIcon(rolloverIcon);

ImageIcon pressedIcon = new ImageIcon("image/draw" + i + "-2.jpg");
btn1.setPressedIcon(pressedIcon);

ImageIcon selectedIcon = new ImageIcon("image/draw" + i + "-3.jpg");
btn1.setSelectedIcon(selectedIcon);
}





/*
JRadioButton btn1=new JRadioButton("直线");
left.add(btn1);//加在左边面板
group.add(btn1);//添加分组
btn1.setActionCommand("line");//设置唯一标识
btn1.setSelected(true);


JRadioButton btn2=new JRadioButton("矩形");
left.add(btn2);
group.add(btn2);
btn2.setActionCommand("rect");//设置唯一标识

JRadioButton btn3=new JRadioButton("椭圆");
left.add(btn3);
group.add(btn3);
btn3.setActionCommand("oval");//设置唯一标识
*/

//给中间的面版添加绘图板
JPanel drawPanel=new JPanel();
Dimension drawDim=new Dimension(400,300);//设置大小
drawPanel.setPreferredSize(drawDim);
drawPanel.setBackground(Color.white);

//面板的默认布局为流式布局
//指定布局为流式布局左对齐
FlowLayout f1=new FlowLayout(FlowLayout.LEFT);
center.setLayout(f1);
center.add(drawPanel);


jf.setVisible(true);


DrawListen lis = new DrawListen(drawPanel,group);
drawPanel.addMouseListener(lis);




//获取drawPanel在屏幕上的区域,

}
}




DrawListen类
package Draw;

import java.awt.Graphics;
import java.awt.dnd.MouseDragGestureRecognizer;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JComponent;
import javax.swing.JPanel;

public class DrawListen implements MouseListener {
private int x1, x2, y1, y2;// 鼠标挤压和离开时的坐标
private JPanel drawPanel;
private Graphics g3;
private ButtonGroup group;
private String str = "line";
private boolean first=true;

public DrawListen(JPanel dp, ButtonGroup b) {
drawPanel = dp;
group = b;

}

// 鼠标挤压
@Override
public void mousePressed(MouseEvent e) {
// 鼠标按下准备画的时候获取能绘制的区域,画布
g3 = drawPanel.getGraphics();
// 鼠标按下准备绘制的图形才确定所选择的单选按钮(画笔)
// 获得被选中的按钮模型
ButtonModel model = group.getSelection();
// 获得动作命令[每一个按钮的唯一标识
str = model.getActionCommand();
x1 = e.getX();
y1 = e.getY();

// 颜料--------------------------
if (str.equals("8")) {
g3.drawString(".", x1, y1);
g3.drawString(".", x1 + 3, y1);
g3.drawString(".", x1, y1 + 3);
g3.drawString(".", x1 + 3, y1 + 3);
g3.drawString(".", x1 - 3, y1);
g3.drawString(".", x1, y1 - 3);
g3.drawString(".", x1 - 3, y1 - 3);
g3.drawString(".", x1 - 6, y1);
g3.drawString(".", x1 + 6, y1);
g3.drawString(".", x1, y1 + 6);
g3.drawString(".", x1 + 6, y1 + 6);
g3.drawString(".", x1 - 6, y1);
g3.drawString(".", x1, y1 - 6);
g3.drawString(".", x1 - 6, y1 - 6);
}

// *-------颜料**************


//铅笔
if(str.equals("6")){
x1 = x2 = e.getX();
y1 = y2 = e.getY();
drawPanel.addMouseMotionListener(adapter);
    drawPanel.addMouseListener(adapter);
}
//铅笔




//橡皮擦
if(str.equals("2")){

}


//橡皮擦

}

// 鼠标离开
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
x2 = e.getX();
y2 = e.getY();

// 画图,圆,直线,矩形

if (str.equals("line")) {//直线
g3.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;
g3.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;
g3.drawOval(x, y, width, height);
}else if(str.equals("6")){//铅笔
if (e.getButton() == MouseEvent.BUTTON1) {
drawPanel.removeMouseListener(adapter);
drawPanel.removeMouseMotionListener(adapter);
}
}
}


// 鼠标拖拽事件,在鼠标拖动的时候触发*************铅笔*****
MouseAdapter adapter = new MouseAdapter() {
public void mouseDragged(MouseEvent e) {
//循环使用drawLine方法来画线条,交换(x1,y1)和(x2,y2)的位置
if (first) {
x2 = e.getX();
y2 = e.getY();
g3.drawLine(x1, y1, x2, y2);

first = false;
} else {
x1 = x2;
y1 = y2;
x2 = e.getX();
y2 = e.getY();
g3.drawLine(x1, y1, x2, y2);
}
}
};
//*****************铅笔


public void mouseClicked(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}
}
只实现了几个功能,画笔,直线,圆,矩形,颜料盒

猜你喜欢

转载自qq-24665727.iteye.com/blog/2249765