JAVA JFrame Graphics绘画不显示问题
答案:2 悬赏:10 手机版
解决时间 2021-02-05 21:50
- 提问者网友:浮克旳回音
- 2021-02-05 10:10
JAVA JFrame Graphics绘画不显示问题
最佳答案
- 五星知识达人网友:痴妹与他
- 2021-02-05 11:38
因为你在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(去掉了左右边框)
因为系统会经常调用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(去掉了左右边框)
全部回答
- 1楼网友:大漠
- 2021-02-05 13:02
末尾加一句试试? JF.getRootPane().repaint();追问抱歉 不行
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯