JAVA JFrame Graphics绘画不显示问题

改变JF的大小后运行了:Graphicsg=JF.getRootPane().getGraphics();g.setColor(Color.WHITE);g.fillRe... 改变JF的大小后 运行了:
Graphics g = JF.getRootPane().getGraphics();
g.setColor(Color.WHITE);
g.fillRect(100,100,50,50);
但并没有显示出来,如果在改变JF的大小后 我手动触发上述绘制代码 则可以显示
我觉得应该是绘制的顺序或时间问题 如何解决呢?
展开
 我来答
雪飞潇潇
推荐于2018-03-13 · TA获得超过6274个赞
知道大有可为答主
回答量:1968
采纳率:91%
帮助的人:865万
展开全部

因为你在JFrame外面绘制图形,会特别短暂。

因为系统会经常调用JFrame默认的paint方法或者repaint方法进行绘制。当你的JFrame的paint方法没有具体实现的时候,也就是空白,这个空白会覆盖掉之前绘制的图形

所以解决办法有2个

第一:用javax.swing.Timer类.定时更新JFrame外面绘制的图形,防止被JFrame的paint覆盖掉

第二:写一个JFrame的子类,重写JFrame的paint方法

个人强烈推荐第二种方法!

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class DemoPaint {

public static void main(String[] args) {
JFrame jf = new MyJFrame();
jf.setBounds(160, 250, 300, 350);
jf.setTitle("测试");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);

// 说明因为这里的Graphics对象,绘制的图像都是很短暂的,
// 因为JFrame会调用自己的paint repaint等方法,重新绘制
Graphics g = jf.getRootPane().getGraphics();
g.setColor(Color.RED);// 红色
g.fillRect(100, 100, 50, 50);
System.out.println("最开始初始化的时候执行绘制红色矩形");//偶尔会短暂看到

//为了让绘制的图形一直可视.可以使用Timer方法,每隔1000毫秒更新绘制一次.
Timer t = new Timer(1000, new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
Graphics g = jf.getRootPane().getGraphics();
g.setColor(Color.BLUE);// 蓝色
g.fillRect(100, 100, 50, 50);
System.out.println("方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形");
}
});
t.start();//开始执行Timer
}

}
//写一个JFrame的子类
class MyJFrame extends JFrame {
@Override
public void paint(Graphics g) {//系统自带的paint方法,自动调用
super.paint(g);
g.setColor(Color.WHITE);// 白色
g.fillRect(100, 100, 50, 50);
System.out.println("方法二:系统调用了paint方法 执行绘制了白色矩形");
}

}

输出

最开始初始化的时候执行绘制红色矩形
方法二:系统调用了paint方法 执行绘制了白色矩形
方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形
方法二:系统调用了paint方法 执行绘制了白色矩形
方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形
方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形
方法一:Timer任务每隔1000毫秒 执行绘制蓝色矩形

白色和蓝色矩形位置不一样.

是因为 白色矩形是JFrame里面的位置 100,100(包含了左右边框)

           蓝色矩形是JFrame.getRootPane里面的位置100,100(去掉了左右边框)

梦非梦亦非梦
2015-10-21 · 超过36用户采纳过TA的回答
知道小有建树答主
回答量:57
采纳率:0%
帮助的人:59.4万
展开全部
末尾加一句试试? JF.getRootPane().repaint();
追问
抱歉 不行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式