Java绘图问题

马小李 2014-12-27 03:06:02
之前发帖问过,描述可能有问题重新描述下,绘图部分我使用的是继承了JPanel类,然后先导入一张图片在JPanel上显示这张图标
然后上面有菜单(不在绘图的JPanel上面),点击菜单,菜单下拉,会遮住导入的图片,但是,菜单回收上去之后,图片上留下刚刚菜单遮掩的部分,如图左上角

检查了很久发现这个问题出自这段代码如下:

public void paintComponent( Graphics g )
{
//先保证组件绘制正常

//指定图片载入
//才载入图片
if( loadImage != null )
{
if( loadneed )
super.paintComponent( g );

int height = this.getHeight();
int width = this.getWidth();
int imageHeight = loadImage.getHeight( null );
int imageWidth = loadImage.getWidth( null );

//优先以固定宽度的方式
//等比例显示图片
//绘图的坐标是窗口当前的位置开始
if( ( imageHeight * width/ imageWidth ) < height )
{

g.drawImage( loadImage, this.getLocation().x, this.getLocation().y,
width, imageHeight * width / imageWidth, null );
}
else
{
g.drawImage( loadImage, this.getLocation().x, this.getLocation().y,
height * imageWidth / imageHeight, height, null );
}
loadneed = false;
imageLoad = true;

}//end if loadImage


if( imageLoad && drawLine )
{
Graphics2D g2d = (Graphics2D) g;
g2d.setColor( paintColor );
g2d.drawPolyline(m_polygon.xpoints, m_polygon.ypoints, m_polygon.npoints);

}


}//end paintComponent


其中第一部分是负责绘制图片的,第二个部分是根据鼠标绘制线条的,
如果将代码中if( loadImage != null )改成if( loadImage != null && loadneed )就会出现上述的问题,原因应该是菜单点击之后,又调用了一次paintComponent方法,使用if( loadImage != null && loadneed )我的意思是我用鼠标在图片上绘制线条的时候,就不会重绘图片了,因为重绘图片刚才绘制的线条就会被抹去,但是不重绘图片显示又会出现问题

同时,我还有个需要,就是同样一幅画,我可能要重新设置下鼠标绘制线条的颜色,可是只要出现了选择颜色的对话框,那么图片就会被重绘,那么之前绘制的线条就会被清除

不知道有人知道如何解决上面两个问题的冲突吗
...全文
146 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
马小李 2015-01-10
  • 打赏
  • 举报
回复
这个问题研究很久以后,我自行进行了解决 首先说下问题,界面显示其实是一个很复杂的过程,在界面不断的点击变化,出现新的菜单,菜单消失等等步骤中,界面的范围内斗进行了重绘(应该是整个界面的重绘),因此,在每一次重绘的时候都要重新绘制原来显示的所有元素,否则会出现错误,这就解释了为什么我用条件控制图片的加载,只在图片加载第一次绘制,会出现下拉菜单会出现那种灰色颜色块的原因,在新一次的绘制中,图片没有重新绘制,而绘制弹出菜单的时候对该处的背景进行了清除 所以paintComponent方法中,要保证每次绘制的时候,都会把所有原来要绘制的内容重新绘制一遍,这样也解决了第二个问题,鼠标绘制的线条,全部要保存下来,每次都重头重新绘制一次,这样才会保证不会出现界面变化(比如最小化后再打开,比如变化界面大小)后,出现线条不见的现象 当然,这样是非常消耗资源的,我期待有高手能指点我,是不是有重绘“脏”了的部分区域的机制,来提高效率,或者将当前内容进行缓存后再绘制之类的,如有知道的,希望能私信指教,不甚感激
济南大飞哥 2014-12-29
  • 打赏
  • 举报
回复
用java做桌面的不多了吧,不会。帮顶。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧