当前位置: 主页 > 科技企业 >至尊银河的网站_java如何在JPanel中重绘图像 >

至尊银河的网站_java如何在JPanel中重绘图像

java如何在JPanel中重绘图像


在JPanel中画图要重写
public void paintComponent(Graphics g){
super.paintComponent(g);
///
}

直到paintComponent里面的代次都会画图

如果想改的话,在画法里面加一些控制代码,在其他地方改变一些变量的值,然后调用repaint();这才是正规的做法

比如
public class A extends JPanel{
private Color color=Color.black;
private boolean show=true;
public void paintComponent(Graphics g){
super.paintComponent(g);
if(show){
g.setColor(color);
g.fillOval(0, 0,20, 20);
}
}

public void setOvalColor(Color c){
color=c;
repaint();
}

public void setOvalVivible(boolean v){
show=v;
repaint();
}

}JPanel panel=new JPanel;
...
...
动态加入组件;//panel显示出来
panel.updateUI();()//更新panel会更新显示有这句 动态更新组件public void draw(){
Graphics g = this.getGraphics();//获取当前使用的画笔
g.setColor(this.getBackground());//设景位画笔颜色
g.fillOval(0, 0, this.getWidth(), this.getHeight());//景色填充整个界面,也就是去掉
g.setColor(Color.BLACK);//重新设置颜色
//设置图形形状
········

super.paint(g);
}

我没测试过,不过大致思想是这样的这个用抽象类或者借口都可以很方便的实现 ,具体你可以加我QQ 495904500问我
winform程序设计中怎样使用GDI+重绘,将多个图片以坐标定位放在一个pictureBox控件中

Image img = Image.FromFile("e:/tx.jpg"); //图象
Image img2 = Image.FromFile("e:/tx2.jpg");
//PictureBox 重绘事件
private void pic_dp_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics; //触发控件的画
  //在 PictureBox 控件相对坐标(0, 0)处画第一张图
  g.DrawImage(img, new Point(0, 0));
  //相对坐标(10, 10)处二张图
  g.DrawImage(img2, new Point(10, 10));
}追问

那要是做连连看游戏界面的话就得用循环?用循环的话是不是要用imsgelist来装图片?追答

装图片的话可以用 imagelist,控件本身就会把图片引用到项目

如果是我的话,更喜欢把图片引用到项目(Resources)
然后用 List 来储存

区别在于一个是选择图片,初始化数据
一个是自己写代码给集合加数据

做连连看的话,循环是必不可少的
但似乎用 GDI 绘图的话,点击事件要自己写的说(根据坐标区域判断,点的是哪张图片),
可以考虑循环输出 PictureBox,等实现後在转为 GDI 版本在Paint事件里控制重绘追问

能不能写下代码啊
C#做图像处理时,什么时候需要重绘?


你应该考是把所有操作的【结果】保存
当需要重绘的时候如窗口面恢复到前面,或者从最小化状态恢复到正常状态时,就把【结果】绘制出来
你的重绘事件响应函数里面应该只有一个工作:不管过程,只绘制结果追问

我刚刚接触图像处理这块,对很多都不熟悉,请问如果我要自动播放一张图片的话,保存的结果应该是什么呢?位移量?还有,这个里面我牵扯到对一幅图片添加标注信息而且能够取消,所以用了双缓冲,这样我就迷糊了,不知道该对哪个图像操作了。请教教我,谢谢!追答

双缓冲,这是前提?那么简单说下,我不知道你用的哪种方式来实现双缓冲
但是双缓冲的目的都是一样的,是用来防止绘图操作使图像产生闪烁。原理就是两张图,一张在前面显示着,一张在后头画一切画完了再显示,替下来的那张再用来绘图。
无论你用哪种双缓冲,最后都是要达到这样的目的。

那么我们现在正式把你涉及的工作分两部分:
1. 绘制:在后台图像上准备要显示的图像,准备就绪后再显示
2. 显示:在后台图像准备就绪后显示,或者窗口被遮挡过,那就需重新显示需要更新的区域。
这就如你的图片、线条、文字标注是模特,你的程序是画家,屏幕是你的BOSS。画家就是在模特们摆好了POSE之后画下来,然后把画稿EMAIL给BOSS看。

那么下面是两步工作的细节。
绘制:
对于你的画面来说,首先,你的绘图应该是一个针对对象的操作吧?比如,图像、线条、点、文字标注。它们可以放大、缩小、移动,对吧?用户画过哪些东西,画成了什么样子,这个都需要记录下来。这样的话你就可以随时操作每一个部件,比如取消掉标注信息。另外,还有动画,这个你可以暂时先不考虑,押后一点,无非就是再多个时间轴控制而已。
那么绘制流程就是:你的对象列表发生了变化,需要更新;程序就读取所有的图像、线条……;清空掉后台画布;把部件一一画在当前的后台画布上;全部绘制完成后,就把后台画布交到前台,前台画布拿到后台;通知窗口更新显示。

显示:
这个操作就比较简单了,流程如下:
窗口的显示需要更新;程序把当前前台的画布,也就是用来显示的画布显示到窗口中;结束绘制。
补充:这里可以参考limlee回答的使用剪切区域的内容进行优化,只刷新显示需要重绘的区域。不过并不是必须的。

因为不知道你是如何实现的双缓冲,但是原理大体如此的。如果觉得还不明白,我的建议是你先研究一下双缓冲的实现,再去考虑绘制图像部件的事。每一步都写入重绘也是可以的,但最法是使用剪切区域
你可以参考

我简单解释:剪切区域是你只重绘 发生变化的地方
例如你提到的画线,在画线之前,你可以将背景画到一个作为缓冲的Bitmap上,在你画线的过程中,因为背景不会改变,所以只需要直接将缓冲Bitmap绘出,然后再在上层绘制线条即可

这个过程节省了大量的重绘工作,所以会提高性能。。
c#2008窗体如何重绘背景图片


使用双缓冲是比较好的方法,具体实线网上有比较丰富的资料。

by:宁唯.可以考虑使用双缓冲的办法,你去查阅相关资料就可以了!没现成的代码,
思路如下:
你删除那就重画那一块的背景

比如你删除 22,45
你就绘制 背景图片的22,45不会闪烁的改变form的Size会触发窗体重绘,不过可能会闪User32.dll 下有3个函数, CreateWindow(???), ShowWindow(???), UpdateWindow(???), 所有的窗体都是从这里继承来的


上一篇:
下一篇:

中国科学技术馆|科技馆|中国科技馆
科技内涵|科技企业|科技园区|科技导读|网站地图