JDialog绘制图形的问题

weiryou10 2012-06-29 01:37:31
我不重写paint方法,在其他方法里面使用
Graphics g = getGraphics();
g.setColor(Color.BLUE);
g.fillRect(0, 0, width, height);
为什么就显示不出来,因为需要所以不能用paint,求解决方法
...全文
231 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
raistlic 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:

最安全的就是重写paint()函数,否则处理你这种问题会很麻烦,相当于你要捕捉所有可能覆盖你图形的情况,然后重绘图形;或者定时重绘图形;反正都不是好办法。

如果实在不想重写JDialog的paint()函数,也可以重写Panel的paint()函数。
我还是这样做的,但这样就又出现一个问题囖,每次点击弹出菜单后,图片也要重画,所以导致一闪一闪的
[/Quote]

JComponent 类在其 paint() 方法中实现了双缓冲,一般不建议重写 paint() 方法,除非你有特别的效果需求。

建议的方式是重写 paintComponent() 方法:

public void paintComponent(Graphics g) {

// super.paintComponent(g);
// ...
}

除了双缓冲的问题之外,重写 paintComponent() 方法还保证了你不会影响到此控件内的子控件的绘製。
MiceRice 2012-07-01
  • 打赏
  • 举报
回复
一闪一闪说明重绘没写好,否则不会出现这种情况,两种做法:

1、尽量避免重复绘制,也就是所有绘制都输出到某BufferImage上,然后再一次性输出到主界面的Graphics上;也就是所谓绘制缓冲。
2、不要直接重写JDialog的paint()函数,而是仅重写你自定义(或继承)的一个JPanel的paint();也就是缩小影响范围。


关于双缓冲参见这里:
http://developer.51cto.com/art/201105/259587.htm
weiryou10 2012-07-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

最安全的就是重写paint()函数,否则处理你这种问题会很麻烦,相当于你要捕捉所有可能覆盖你图形的情况,然后重绘图形;或者定时重绘图形;反正都不是好办法。

如果实在不想重写JDialog的paint()函数,也可以重写Panel的paint()函数。
[/Quote]我还是这样做的,但这样就又出现一个问题囖,每次点击弹出菜单后,图片也要重画,所以导致一闪一闪的
MiceRice 2012-07-01
  • 打赏
  • 举报
回复
最安全的就是重写paint()函数,否则处理你这种问题会很麻烦,相当于你要捕捉所有可能覆盖你图形的情况,然后重绘图形;或者定时重绘图形;反正都不是好办法。

如果实在不想重写JDialog的paint()函数,也可以重写Panel的paint()函数。
weiryou10 2012-07-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

没太弄明白你的意思,简单点处理就是你写个类,直接继承JFileChooser,然后想干啥就干啥吧。
[/Quote]我弄出来了我想要的效果,但是又出现了一个新的问题,我绘制了图片之后,再点击弹出菜单会在图片上留下一片灰色的覆盖区域,这个怎么弄喃
nj_dobetter 2012-06-30
  • 打赏
  • 举报
回复
系统会在需要刷新的时候调用paint(), 比如窗口被部分挡住然后又重现。
而你写的那部分绘制代码不会被系统调用到。
MiceRice 2012-06-30
  • 打赏
  • 举报
回复
没太弄明白你的意思,简单点处理就是你写个类,直接继承JFileChooser,然后想干啥就干啥吧。
weiryou10 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

其实并不复杂,但不知道你问题卡在哪里了,所以只好给你个例子你自己看看了。。。

Java code

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionLis……
[/Quote]我知道你这个意思,我想弄一个JFileChooser然后不管你打开什么文件背景色都会改变,你说这个应该怎么弄呢
pengfeifei2011 2012-06-29
  • 打赏
  • 举报
回复
我不知你是为什么不能覆盖paint() ,java一般是把JFrame或者JPanel 做为画布来绘制图形的,JFrame布一般会调用自己的paint()绘图,而JPanel调用paintComponent(),除非覆盖这些方法。
MiceRice 2012-06-29
  • 打赏
  • 举报
回复
其实并不复杂,但不知道你问题卡在哪里了,所以只好给你个例子你自己看看了。。。


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;

public class TestDialog extends JDialog implements ActionListener {

JButton btnFillRect;

public TestDialog() {
this.setSize(640, 480);
btnFillRect = new JButton("Fill Rect");
btnFillRect.addActionListener(this);
this.add(btnFillRect, BorderLayout.SOUTH);
this.getGraphics();
}

public void actionPerformed(ActionEvent e) {
Graphics g = this.getGraphics();
g.setColor(Color.RED);
g.fillRect(50, 50, 200, 200);
}

public static void main(String[] args) {
TestDialog dialog = new TestDialog();
dialog.setVisible(true);
}
}
weiryou10 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

那要看你是怎么调用这个“其他方法”的了。很有可能是被paint()给覆盖掉了。
[/Quote]就是在自己定义的一个方法里面填充矩形,按你说的那应该怎么办呢
MiceRice 2012-06-29
  • 打赏
  • 举报
回复
那要看你是怎么调用这个“其他方法”的了。很有可能是被paint()给覆盖掉了。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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