图形化界开发,关于画布的问题
,虽然暂时没有足够的时间做下去(含蓄的表示还在苦逼的的课程设计中苦苦的不能自拔,?? T.T),但以后会多多花些时间在上面多多学习欣赏创造间在上面多多学习欣赏创造? ,这个过程中也发现了不少问题
比如说,获取画布在上面画东西。本人琢磨了许久,一开始只知道用添加监听器来实现,但是后来觉得不是很方便,假如打开窗口惊喜就在你的眼前岂不更好,?? 自己摸索了1~2天,经过几次试验和调试,发现了可以用 绘图类Graphics和画布Canvas 类来实现获取画板画布并画图。
? 首先介绍一下添加监听器的方法,这个是我们五子棋中的一贯做法,这里可以照搬过来,以鼠标点击窗体上按钮来作为事件源(只是举一例,其他自己可以YY啦~~~,在此就不罗嗦),打开窗体后不会有显示出你的图像哟,点击按钮,图像才会显现。简要附上关键代码
/** * 定义五子棋的窗体类,该类继承自JFrame * @author YangKang * */public class Five_In_Row extends JFrame{[color=orange]/***Five_In_Row是JFrame窗体类的子类,这样才能获取画布和重绘*/[/color]//定义入口主函数public static void main(String[] args) {Five_In_Row df = new Five_In_Row();df.iniGUI();}/** * 定义一个初始化界面的方法 */public void iniGUI(){//设置窗体的属性值this.setTitle("五子棋");this.setSize(new Dimension(580,600));this.setDefaultCloseOperation(3);this.setLocationRelativeTo(null);//以上不是重点,可以忽略this.setVisible(true); //这一步及其重要,必须放在获取画布对象之前,否则不能获取到画布对象//在窗体可见之后,获取画布的对象 //获取画布对象的关键语句[/color]Graphics g = this.getGraphics();//实例化事件处理类的对象ChessListener cl = new ChessListener(g);//给事件源添加鼠标监听器方法,绑定事件处理类的对象this.addMouseListener(cl);}添加动作监听器public class ChessListener extends MouseAdapter {//定义画布属性private Graphics g;/** * 构造方法 * @param g要赋给属性的参数名 */ //添加构造器,传入画布对象public ChessListener(Graphics g){this.g = g;}
接下来扯一下怎么直接获取画布绘图
用绘图类Graphics画图
/** * 分形 * @author YangKang * */public class Fractal extends JFrame {/** * 程序的入口主函数 * @param args */private Graphics g;//必须定义全局变量,否则将被判为空指针!!! public static void main(String[] args) {//实例化分形窗口主界面Fractal fl = new Fractal();fl.iniGUI();}/** * 定义一个初始界面的方法 */public void iniGUI(){//设置窗口的属性this.setTitle("分形界面");this.setSize(new Dimension(800,800));this.setDefaultCloseOperation(3);this.setLocationRelativeTo(null);//以上都是废话this.setVisible(true);//窗体不要搞时髦设隐形g = this.getGraphics();//获取窗体画布}/** * 定义一个分形图形的方法 */public void frac(Graphics g){//接下来随意发挥~~~,什么g.fillxxx, g.drawxxx都用上..... }
画布Canvas类获取画布
/***CanvasDemo 是Canvas 画布类的子类,说白了Canvas类也基本用到了Graphics方法。 */public class CanvasDemo extends Canvas {/** * 定义一个绘图的方法 *///重绘方法public void paint(Graphics g){//绘制三角形int x[] = {20 , 80, 140};int y[] = {270, 200, 270};g.drawPolygon(x, y, 3);}/** * @param args定义入口主函数 * */public static void main(String[] args) {JFrame jf = new JFrame();CanvasDemo cm = new CanvasDemo();cm.setSize(300,300);jf.add(cm,BorderLayout.CENTER); jf.pack();//这个什么意思,猜猜看?jf.setVisible(true);}}
也许有留心的孩纸会有疑问,WHY你小子定义的类不是什么继承窗体类就是什么画布类?
因为这些图形界面都继承于Component类,继承窗体和画布类直接可以调用父类重绘的方法,从而不会导致刚打开的画面一下子就消失了。这么晚了,也该睡了.......最后附上画布重绘的方法
public void paint (Graphics g){
super.paint(g);
g...........;//那里不会点哪里吧O.O
}
?