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的大小后 我手动触发上述绘制代码 则可以显示
我觉得应该是绘制的顺序或时间问题 如何解决呢? 展开
Graphics g = JF.getRootPane().getGraphics();
g.setColor(Color.WHITE);
g.fillRect(100,100,50,50);
但并没有显示出来,如果在改变JF的大小后 我手动触发上述绘制代码 则可以显示
我觉得应该是绘制的顺序或时间问题 如何解决呢? 展开
展开全部
因为你在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(去掉了左右边框)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询