[求助]怎么样消除之前画过的轨迹

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.*;

public class J_DrawDemo extends JFrame implements ActionListener

{

panel pl=new panel();//生成panel的一个对象

JPanel jpb=new JPanel();//生成jpb容器,用于放置按钮

JButton jb1;

JButton jb2;

JButton jb3;

JButton jb4;

public J_DrawDemo()

{

super("画图程序");

jb1=new JButton(" 画直线 ");//生成各个按钮对象

jb2=new JButton(" 画椭圆 ");

jb3=new JButton(" 画矩形 ");

jb4=new JButton(" 自由绘图 ");

jb1.addActionListener(this);//注册按钮监听器

jb2.addActionListener(this);

jb3.addActionListener(this);

jb4.addActionListener(this);

jpb.setBorder(BorderFactory.createEtchedBorder());//设置jpb边界

pl.setBorder(BorderFactory.createEtchedBorder());//设置pl边界

jpb.add(jb1);//在按钮加入jpb

jpb.add(jb2);

jpb.add(jb3);

jpb.add(jb4);

ButtonGroup buttonGroup=new ButtonGroup();//定义一个按钮组,实现按钮互斥

Container cp=getContentPane();//获得容器

cp.add(jpb,BorderLayout.SOUTH);//将工具条加入容器

cp.add(pl,BorderLayout.CENTER);//将pl加入容器

cp.setBackground(Color.white);

setSize(600,500);

this.setResizable(false);//设置窗体大小不可变

setLocation(200,100);//设置窗体在屏幕的显示位置

setVisible(true);//设置窗体可见

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出方式

}

public void actionPerformed(ActionEvent e)//按钮实现动作并执行

{

if(e.getSource()==jb1)

pl.shape=0;

if(e.getSource()==jb2)

pl.shape=1;

if(e.getSource()==jb3)

pl.shape=2;

if(e.getSource()==jb4)

pl.shape=3;

}

public static void main(String[] args)

{

new J_DrawDemo();//调用J_DrawDemo类构造函数

}

}

class panel extends JPanel //定义一个JPanel的字类

{

int shape=-1;

int startX=0,startY=0;

int endX=0,endY=0;

int flag=0;

public panel()

{

//setBackground(Color.white);

addMouseListener(new MouseAdapter()

{

public void mousePressed(MouseEvent e)//鼠标按下事件

{

if(shape==3)//当为自由画线时,执行下面语句

{

endX=e.getX();

endY=e.getY();

}

else

{

startX=e.getX();

startY=e.getY();

}

}

}

);//注册鼠标动作监听器

addMouseMotionListener(new MouseMotionAdapter()

{

public void mouseDragged(MouseEvent e)//鼠标拖拽事件

{

if(shape==3)//当为画自由线时拖动鼠标动作才执行

{

startX=endX;

startY=endY;

endX=e.getX();

endY=e.getY();

repaint();

}

else//当选择画图功能不是自由画线时,则执行下面语句

{

endX=e.getX();

endY=e.getY();

repaint();

}

}

}

);

}

public void paintComponent(Graphics g)//实现画图

{

//super.paintComponent(g);

switch(shape)

{

case 0:

g.drawLine(startX,startY,endX,endY);//画直线

break;

case 1:

int width=endX-startX;

int height=endY-startY;

g.drawOval(startX,startY,width,height);//画椭圆

break;

case 2:

width=endX-startX;

height=endY-startY;

g.drawRect(startX,startY,width,height);//画矩形

break;

case 3:

g.drawLine(startX,startY,endX,endY);//自由画线

break;

}

}

}

搜索更多相关的解决方案:

轨迹  消除

----------------解决方案--------------------------------------------------------

你这不是老程序吗?

你可以把你经过的点保存起来

这样就可以任意的把以前的内容清除了

因为super.paintComponent(g);会清除掉所有的东西,这会使你在画线的时候,看不到刚刚的线

这是它的矛盾点.你只有把这些点啊,线啊,矩形啊,定义成对象的格式,并且让它们共同实现一个接口中的drawSelf方法

这样,你就可以把这些对象保存起来,想要画的时候,把它们取出来画就可以了

----------------解决方案--------------------------------------------------------

可是这们没有一个拉动的过程啊,看不到图形的放大和缩小啊

----------------解决方案--------------------------------------------------------

你在拖动的过程中就重画,而不要等鼠标放下了才重画

----------------解决方案--------------------------------------------------------

能否按我原来的程序进行修改,加个标志位

----------------解决方案--------------------------------------------------------

[CODE]import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class J_DrawDemo extends JFrame implements ActionListener

{

panel pl=new panel();//生成panel的一个对象

JPanel jpb=new JPanel();//生成jpb容器,用于放置按钮

JRadioButton jb1;

JRadioButton jb2;

JRadioButton jb3;

JRadioButton jb4;

public J_DrawDemo()

{

super("画图程序");

jb1=new JRadioButton(" 画直线 ",true);//生成各个按钮对象

jb2=new JRadioButton(" 画椭圆 ");

jb3=new JRadioButton(" 画矩形 ");

jb4=new JRadioButton(" 自由绘图 ");

pl.shape=0;//默认是画直线

ButtonGroup bg=new ButtonGroup();

bg.add(jb1);

bg.add(jb2);

bg.add(jb3);

bg.add(jb4);

jb1.addActionListener(this);//注册按钮监听器

jb2.addActionListener(this);

jb3.addActionListener(this);

jb4.addActionListener(this);

jpb.setBorder(BorderFactory.createEtchedBorder());//设置jpb边界

pl.setBorder(BorderFactory.createEtchedBorder());//设置pl边界

jpb.add(jb1);//在按钮加入jpb

jpb.add(jb2);

jpb.add(jb3);

jpb.add(jb4);

ButtonGroup buttonGroup=new ButtonGroup();//定义一个按钮组,实现按钮互斥

Container cp=getContentPane();//获得容器

cp.add(jpb,BorderLayout.SOUTH);//将工具条加入容器

cp.add(pl,BorderLayout.CENTER);//将pl加入容器

cp.setBackground(Color.white);

setSize(600,500);

this.setResizable(false);//设置窗体大小不可变

setLocation(200,100);//设置窗体在屏幕的显示位置

setVisible(true);//设置窗体可见

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出方式

}

public void actionPerformed(ActionEvent e)//按钮实现动作并执行

{

if(e.getSource()==jb1)

pl.shape=0;

if(e.getSource()==jb2)

pl.shape=1;

if(e.getSource()==jb3)

pl.shape=2;

if(e.getSource()==jb4)

pl.shape=3;

}

public static void main(String[] args)

{

new J_DrawDemo();//调用J_DrawDemo类构造函数

}

}

class panel extends JPanel //定义一个JPanel的字类

{

int shape=-1;

int startX=0,startY=0;

int endX=0,endY=0;

int flag=0;

public panel()

{

//setBackground(Color.white);

addMouseListener(new MouseAdapter()

{

public void mousePressed(MouseEvent e)//鼠标按下事件

{

if(shape==3)//当为自由画线时,执行下面语句

{

endX=e.getX();

endY=e.getY();

}

else

{

startX=e.getX();

startY=e.getY();

}

}

}

);//注册鼠标动作监听器

addMouseMotionListener(new MouseMotionAdapter()

{

public void mouseDragged(MouseEvent e)//鼠标拖拽事件

{

if(shape==3)//当为画自由线时拖动鼠标动作才执行

{

startX=endX;

startY=endY;

endX=e.getX();

endY=e.getY();

repaint();

}

else//当选择画图功能不是自由画线时,则执行下面语句

{

endX=e.getX();

endY=e.getY();

repaint();

}

}

}

);

}

public void paintComponent(Graphics g)//实现画图

{

switch(shape)

{

case 0:

super.paintComponent(g);

g.drawLine(startX,startY,endX,endY);//画直线

break;

case 1:

super.paintComponent(g);

int width=endX-startX;

int height=endY-startY;

g.drawOval(startX,startY,width,height);//画椭圆

break;

case 2:

super.paintComponent(g);

width=endX-startX;

height=endY-startY;

g.drawRect(startX,startY,width,height);//画矩形

break;

case 3:

g.drawLine(startX,startY,endX,endY);//自由画线

break;

}

}

}[/CODE]

帮你改了一点点,你看看吧,像这种选择项最好不是用普通按钮来做

用单选按钮来做

否则别人不知道按了哪个

----------------解决方案--------------------------------------------------------

谢谢封哥,不过这样一来,就只能画一种图形了,之前画过的就不见了,这样好像不好吧

----------------解决方案--------------------------------------------------------

所以,我建议你把以前的图形保存起来

用一个接口来实现多态

----------------解决方案--------------------------------------------------------

以下是引用千里冰封在2006-12-22 19:47:50的发言:

所以,我建议你把以前的图形保存起来

用一个接口来实现多态

这种机制java 核心类库里面已经有了.

参看java.awt.geom.Shape

[此贴子已经被作者于2006-12-22 20:04:50编辑过]

----------------解决方案--------------------------------------------------------

是的

就是这种思想

----------------解决方案--------------------------------------------------------

java怎么清空paint所画图案,[求助]怎么样消除之前画过的轨迹相关推荐

  1. java画方块_[求助]用Swing就画一个方块代码出错了

    [求助]用Swing就画一个方块代码出错了 本意就是画个方块... 我都不行...郁闷..........帮帮我. 然后最好能告诉我下如果只想画个方块我写的代码哪句是废话..谢谢! 等待ING.... ...

  2. Simple java里面的paint(Graphics g)的理解

    以前写画图板时,总不理解什么时候要调用这个方法,老师说:你写了paint(g)方法后,在窗体改变时,就会调用,可是不太理解. 没写paint(g)的演示:画图板v1 1:绘制简单直线 2.执行最小化操 ...

  3. java 坦克重叠_【Java】我所知道坦克大战(单机版)之画出坦克的实心圆、让圆动起来、双缓冲解决闪烁问题...

    28640发布于 今天 02:47 本篇文章目的 画出坦克的实心圆 让坦克圆动起来 双缓冲解决闪烁问题 一.画出代表坦克的实心圆 我们需要画出一个圆,那么可以使用fillOval方法 fillOval ...

  4. java心形代码_使用java打印心型、圆形图案的实现代码_java

    相信对于打印三角形都没什么难度,只需要利用for循环嵌套使用就行 但是对于打印圆形和三角形不同因为到圆心距离相等的点一般不会横坐标和纵坐标都为整数 打印爱心 爱心的公式 (x²+y²-1)³-x²*y ...

  5. java图案_用java实现 图片组成心形图案

    用java实现 图片组成心形图案 来源:互联网 作者:佚名 时间:2014-03-15 17:52 灵感:java2核心技术卷1(共两卷)最近在看java2核心技术里面提到显示图片,于是就做了个心形图 ...

  6. java打印星型_使用java打印心型、圆形图案的实现代码

    相信对于打印三角形都没什么难度,只需要利用for循环嵌套使用就行 但是对于打印圆形和三角形不同因为到圆心距离相等的点一般不会横坐标和纵坐标都为整数 打印爱心 爱心的公式 (x²+y²-1)³-x²*y ...

  7. java打印心_使用java打印心型与圆形图案实现代码示例

    本篇文章小编给大家分享一下使用java打印心型与圆形图案实现代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 相信对于打印三角形都没什么难度,只 ...

  8. java stringbuilder 清空问题

    java stringbuilder 清空问题 我也是碰到了这个问题才开始研究的,网上答案偏多,并且时间范围也比较大,各个版本的java 优化也不清楚,只能说我的java环境是1.7,测试给大家看. ...

  9. 使用Java语言打印一个心形图案

    要使用 Java 语言打印一个心形图案,你可以使用两个 for 循环和一些字符串拼接来实现.你也可以使用 ASCII 码来打印心形图案,这将更加简单. 以下是使用两个 for 循环和字符串拼接的示例代 ...

最新文章

  1. SQL Server中的分页查询
  2. php root 启动,php-fpm如何以root身份启动
  3. 【kafka】kafka NoSuchElementException ArrayDeque getLast 压缩方式不同
  4. easyui上传文件 jsp+js+controller
  5. 中文 哈工大_第六届中文语法错误诊断大赛,哈工大讯飞联合实验室再获多项冠军...
  6. Android4火狐,Android版火狐4正式发布
  7. 如何使用代码获取电脑内存_代码实战 | 如何在 Android 开发中使用协程
  8. java json.stringify_JSON.stringify 语法实例讲解
  9. PowerBi包含什么,以及每一个的介绍
  10. c语言-链表-贪吃蛇
  11. C语⾔核⼼基础知识之printf
  12. SkyWalking8.4监控跨线程问题解决
  13. 罗永浩自曝下个创业项目是元宇宙
  14. java cas logout无效_CAS logout 解决方案
  15. GL-Studio 4.3-1 安装
  16. 华为HCIE有什么方向?哪个最热门
  17. PLC-串口通信实例
  18. pythonxlabel位置_Matplotlib:如何为每个子区域添加xlabel,标题
  19. Redux-thunk中间件
  20. 西电计科模电期末复习提纲+一些个人笔记

热门文章

  1. 百度地图坐标增强现实 (雷达效果)附全国离线地图
  2. 如果取消Windows Ink后ps画笔没有压感
  3. linux系统文件空间清理摸9z,Linux下的文件加密
  4. 2023计算机毕业设计选题推荐——Java项目
  5. 计算机算法——进入计算机世界
  6. SolidWorks快速绘制齿轮模型
  7. 计算机软考高级好考吗?需要备考多久?
  8. 2019第一季度全球流媒体战况如何?
  9. 世界星载SAR发展2——SeaSat(1978,美国)
  10. POJ1163 The Triangle