JAVA初学—关于JFrame图形保存的思路
为什么绘制好的线条或者图形会清空?
在窗口打开,移动窗口进入边界,缩放窗口时,它会自动调用一个paint方法,而这个paint方法中并没有我们绘制的内容。于是,每次进行这些动作时,窗口都相当于绘制了一个空白的内容覆盖了原先我们绘制的图形。
解决方法
重写paint方法。
思路
1.保存我们的画图对象数据。
2.将对象数据数据传入paint方法里。
3.重写paint方法,并让保存好的数据按原来的图形方法绘制。
遇到的问题
1.使用paint报错
重写需要先继承,让class类继承窗口JFrame。
或者
把paint写到了其他函数里面。
2.重写的paint方法是否生效
在paint方法中加入输出语句,进行缩放窗口的操作,如果调试台没有出现语句,那么表示重写并未生效。
原因:paint 使用的Graphic并不是从写好的class类里的得到的,这里的class类指的是代码中继承了JFrame的类。
举个例子:
import java.awt.*;
import javax.swing.JFrame;
public class Window extends JFrame{
//主函数
public static void main(String[] args) {
Window L = new Window();
L.UI();
}
//重写paint方法
public void paint(Graphics g) {
super.paint(g);
System.out.println("成功");
}
public void UI() {
//窗口设置
JFrame window = new JFrame();
window.setTitle("画图");
window.setSize(400,500);
//结束程序
window.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
//设置布局
FlowLayout flow = new FlowLayout();
//添加布局
window.setLayout(flow);
//可视化
window.setVisible(true);
//
Graphics g = window.getGraphics();
}
}
像上面这样,paint的重写便不会生效,可以看到这里获取的Graphics g是从UI()类里新建window窗口上得到的。并不是从继承过JFrame的类的窗口上获取到的。
我们将代码更改一下:
import java.awt.*;
import javax.swing.JFrame;
public class Window extends JFrame{
//主函数
public static void main(String[] args) {
Window L = new Window();
L.UI();
}
//重写paint方法
public void paint(Graphics g) {
super.paint(g);
System.out.println("成功");
}
public void UI() {
//窗口设置
//JFrame window = new JFrame();
this.setTitle("画图");
this.setSize(400,500);
//结束程序
this.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
//设置布局
FlowLayout flow = new FlowLayout();
//添加布局
this.setLayout(flow);
//可视化
this.setVisible(true);
//
Graphics g = this.getGraphics();
}
}
将window替换成this,重写的paint方法便生效了,关于this的用法这里不做叙述。也许会在另一篇博客里写=、=