Java学习 之 画图板 ONE
画板
画板为创建的窗体
在窗体JFrame上添加组件
public void initUI(){
JFrame jf=new JFrame();
jf.setTitle("画图板");
jf.setSize(800, 800);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//jf.setResizable(false);
jf.setLocationRelativeTo(null);
//流式布局
FlowLayout fl=new FlowLayout();
jf.setLayout(fl);
//按钮
JButton btnLine=new JButton("直线");
JButton btnRect=new JButton("矩形");
JButton btnOval=new JButton("圆");
JButton btntri=new JButton("三角形");
JButton btnEraser=new JButton("橡皮擦");
JButton btnlft=new JButton("立方体");
jf.add(btnLine);
jf.add(btnRect);
jf.add(btnOval);
jf.add(btntri);
jf.add(btnEraser);
jf.add(btnlft);
JButton btnColor=new JButton("颜色");
jf.add(btnColor);
jf.setVisible(true);
在面板JPanel上添加组件
面板JPanel需要添加在窗体JFrame上
//按钮面板
JPanel jp = new JPanel();
jp.setBackground(new Color(255,200,250));//设置按钮面板背景色
jp.setPreferredSize(new Dimension(100,100));//设置大小,如果放在西方向上,高设置了不起作用,会占满
//绘画面板
MyJPanel jpDraw=new MyJPanel();
jpDraw.setBackground(new Color(255,230,250));//画板背景色
//jpDraw.setPreferredSize(new Dimension(100,100));//设置了没用懒得设,反正都占满,呸
//边界布局
BorderLayout bl = new BorderLayout();
jf.setLayout(bl);
JButton btnLine=new JButton("直线");
JButton btnRect=new JButton("矩形");
JButton btnOval=new JButton("圆");
JButton btntri=new JButton("三角形");
JButton btnEraser=new JButton("橡皮擦");
JButton btnlft=new JButton("立方体");
jp.add(btnLine);
jp.add(btnRect);
jp.add(btnOval);
jp.add(btntri);
jp.add(btnEraser);
jp.add(btnlft);
JButton btnColor=new JButton("颜色");
jp.add(btnColor);
JSlider sld=new JSlider(0,100);
jp.add(sld);
//将按钮面板添加到窗体上的西方向
jf.add(jp,BorderLayout.WEST);
//将画图面板添加到窗体上的除东南西北四个方向面板位置的中间
jf.add(jpDraw);
jf.setVisible(true);
在画板上添加菜单栏
菜单栏:JMenuBar
菜单: JMenu
菜单项: JMenuItem
菜单项添加在菜单上,菜单添加在菜单栏上,菜单栏添加在容器上
//菜单栏:JMenuBar
JMenuBar jmb=new JMenuBar();
//菜单: JMenu
JMenu jmfile=new JMenu("文件File");
JMenu jmEdit=new JMenu("编辑Edit");
JMenu jmDraw=new JMenu("分形");
//菜单项: JMenuItem
JMenuItem fileItem=new JMenuItem("新建");
JMenuItem DrawItem1=new JMenuItem("分形1");
JMenuItem DrawItem2=new JMenuItem("分形2");
JMenuItem DrawItem3=new JMenuItem("分形3");
//菜单项“新建”添加在菜单“文件”中
jmfile.add(fileItem);
//三个菜单项“分型123”添加在菜单“分型”中
jmDraw.add(DrawItem1);
jmDraw.add(DrawItem2);
jmDraw.add(DrawItem3);
//菜单“文件”“编辑”“分型”添加在菜单栏上
jmb.add(jmfile);
jmb.add(jmEdit);
jmb.add(jmDraw);
//窗体设置菜单栏,不用add用set
jf.setJMenuBar(jmb);
下面是炒鸡无敌巨好看的少女粉色画板

(真的是和本人一样好看_(:3」∠❀)_)
画笔
绘制工具 Graphics
不能直接实例化
需要从绘制的组件或窗体上使用getGraphics()获得
Graphics g=jpDraw.getGraphics();
鼠标监听器
接口MouseListener
public interface MouseListener extends EventListener {
public void mouseClicked(MouseEvent e);//点击鼠标时调用
public void mousePressed(MouseEvent e);//按压鼠标时调用
public void mouseReleased(MouseEvent e);//释放鼠标时调用
public void mouseEntered(MouseEvent e);//鼠标进入时调用
public void mouseExited(MouseEvent e);//鼠标离开时调用
}
接口MouseMotionListener
public interface MouseMotionListener extends EventListener {
public void mouseDragged(MouseEvent e);//鼠标拖动
public void mouseMoved(MouseEvent e);//鼠标移动
}
创建监听器类
一个类可以实现多个接口,这里用了动作监听器和鼠标监听器
public class DrawListener implements MouseListener,ActionListener,MouseMotionListener{
int x1,x2,y1,y2;//坐标
int x3,y3,x4,y4,x5,y5;
Graphics g;//画笔
String btnstr;//按钮内容
int xs,ys;
int num=0;
...
}
绘制一根直线
直线的参数:两个点坐标
事件产生的源:MouseEvent
操作的实现:通过鼠标来绘制
鼠标监听器:MouseListener
按下鼠标时记录一个点的坐标,释放鼠标时记录另一个点的坐标,然后画出直线
public void actionPerformed(ActionEvent e){
btnstr=e.getActionCommand();//获得按钮内容
}
public void mousePressed(MouseEvent e){
x1=e.getX();
y1=e.getY();
//按下鼠标获得第一个点的坐标
}
public void mouseReleased(MouseEvent e){
//第二个点坐标
x2=e.getX();
y2=e.getY();
if(btnstr.equals("直线")){
//绘制直线
g.drawLine(x1, y1, x2, y2);
}
}
绘制矩形和圆同理
矩形以左上角的坐标为参数,圆以外接矩形左上角的坐标为参数
左上角的坐标是较小的坐标,所以如果画的时候是反着画的,就要交换坐标,不然矩形边长就是负的了。
if(x1>x2){
int xt=x1;
x1=x2;
x2=xt;
}
if(y1>y2){
int yt=y1;
y1=y2;
y2=yt;
}
然后再调用方法画图
g.drawRect(x1, y1, x2-x1, y2-y1);//矩形
g.drawOval(x1, y1, x2-x1, y2-y1);//圆
绘制多边形
鼠标点击一下出现一个点与前一个点相连,双击鼠标该点与前一个点和第一个点相连,出现一个多边形
int n=e.getClickCount();可以获得点击鼠标次数
public void mouseClicked(MouseEvent e){
int rx=e.getX();
int ry=e.getY();
int n=e.getClickCount();//获得点击次数
System.out.println("点了"+n+"下");
if(btnstr.equals("三角形"))
{
if(n==1){//单击鼠标
if(num==0){//表示当前是第一个点
xs=e.getX();
ys=e.getY();
x3=xs;//记录前一个坐标
y3=ys;
}
else{
x4=e.getX();
y4=e.getY();
g.drawLine(x3, y3, x4, y4);//当前点与前一个点连线
x3=x4;//更新前一个点坐标
y3=y4;
}
}
else if(n==2){//双击鼠标
x5=e.getX();
y5=e.getY();
g.drawLine(x3, y3, x5, y5);//与前一个点连线
g.drawLine(xs, ys, x5, y5);//与第一个点连线
num=0;
}
}
橡皮擦
拖动鼠标时,画出一个填充色为背景色的小矩形。
//橡皮擦
@Override
public void mouseDragged(MouseEvent e) {
int xd=e.getX();
int yd=e.getY();
if(btnstr.equals("橡皮擦")){
g.setColor(new Color(255,230,250));//颜色为背景色
g.fillRect(xd, yd, 10, 10);//填充一个小矩形
System.out.println("橡皮擦");
}
}
使用更多颜色画图
点击颜色按钮时弹出颜色选择器
public void actionPerformed(ActionEvent e){
btnstr=e.getActionCommand();
if(btnstr.equals("颜色")){
JColorChooser jc=new JColorChooser();//颜色选择器
Color cl=jc.showDialog(null, btnstr, Color.black);//弹出框
JButton btn =(JButton) e.getSource();//取到点击的组件源
btn.setBackground(cl);//修改“颜色”按钮的颜色为选择到的颜色
g.setColor(cl);//设置画笔颜色
}
}

没得了
本文详细介绍如何使用Java Swing创建一个多功能画图板应用,包括直线、矩形、圆形、多边形绘制,橡皮擦功能及颜色选择,同时讲解了在JFrame上添加组件、JPanel使用、菜单栏创建及鼠标监听器实现。
8358

被折叠的 条评论
为什么被折叠?



