网络书屋(Web Reading Room)

A blogging framework for hackers.

简易的代码运行模拟窗口

有时候,可能需要做一个动态的代码演示的窗口,当然用ppt也可以做,用其他的相关软件也可以做。然而自己写代码也是可以的。相信大家在听杨老师讲解treeview的时候,老杨秀的代码分析小程序,凭着印象,自己也琢磨着写了这一个简易的代码运行模拟窗口。代码涉及到的主要是treeview和textview以及按钮事件控制,另外加上cairo的画图处理,当然也可以直接利用GtkImage载入图片(可能需要隐藏控件,达到箭头下移的目的) 这边的缺点是,暂时不知道怎么销毁掉Cairo之前绘制的图形,其他还有很多缺点.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
import com.rupeng.gtk4j.Cairo;
import com.rupeng.gtk4j.GTK;
import com.rupeng.gtk4j.IGCallBack;

/**
* @author    叶昭良
* @time      2015年2月3日上午10:24:23
* @version   TestTeacher V1.0   一个简易的代码运行模拟窗口,未加入代码的高亮,采用图片控制
*                               主要采用textview  treeview    cairo三个技术关键点
*/
public class TestTeacher
{

        /**
         * @param args
         */
        //部分类变量的定义
        static int window;
        static int gridHouse;

        static int liststore;
        static int listiter;
        static int treeViewApple;
        static int imagePosition = 0;
        static int rowPosition = 0;
        //static int dan ;
        static int start = 0;
        static int circlePointx = 200;
        static int circlePointy = 45;

        static int circleRectangex = 200;
        static int circleRectangey = 0;

        static int EndCirclex = 0;
        static int EndCircley = 0;
        static String note = "指针下移";
        static int labelResult;

        //static String loveWords;
        public static void main(String[] args)
        {
                // TODO Auto-generated method stub
                //GTK初始化
                GTK.gtk_init();
                //窗口对象标识的创建
                window= GTK.gtk_window_new(GTK.GTK_WINDOW_TOPLEVEL);
                //显示窗口
                GTK.gtk_widget_show(window);
                //安静关闭窗口
                GTK.g_signal_connect(window, "destroy", new IGCallBack()
                {

                        @Override
                        public void execute(int instance, int eventData, Object object)
                        {
                                // TODO Auto-generated method stub
                                GTK.gtk_main_quit();
                        }
                }, null);

                //设置网格布局
                gridHouse = GTK.gtk_grid_new();
                GTK.gtk_widget_show(gridHouse);
                //添加网格布局到window中
                GTK.gtk_container_add(window, gridHouse);

                //定义一些常用的控件

                //创建一个treeview 用于显示用户信息
                createSingleTreeView(gridHouse,start);
                //创建一个笑脸
                createDrawLaughFace(window,gridHouse,start,circlePointx,circlePointy);

                start = 3;
                //创建一个标签
                createLabel("源代码------>",gridHouse,start);
                start = 4;
                //创建一个源码的textview窗口,不可编辑
                createSingleTextView(window,gridHouse,start);
                createRectangleFace(window,gridHouse,3,circlePointx,circlePointy);

                start = 4;
                //创建一个按钮
                int textViewOutput = GTK.gtk_text_view_new();
                createNextButton(gridHouse,textViewOutput,start);

                start =3;
                //创建一个标签
                labelResult = GTK.gtk_label_new("输出结果:");
                GTK.gtk_widget_show(labelResult);
                GTK.gtk_grid_attach(gridHouse, labelResult,7, start, 1, 1);
                start = 4;

                //创建一个输出界面,用于显示源码输出地结果
                createOutputTextView(window,gridHouse,start,textViewOutput);
                //启动循环
                GTK.gtk_main();
        }
        /**
         * 
         * @param labelName  标签显示的字符串
         * @param gridHouse  网格对象标识
         * @param start      标签在网格对象标识的起始位置
         * @purpose          创建一个标签对象表示,并显示在窗口中
         */
        public static void createLabel(String labelName,int gridHouse,int start)
        {
                int labelTitle = GTK.gtk_label_new(labelName);
                GTK.gtk_widget_show(labelTitle);
                GTK.gtk_grid_attach(gridHouse, labelTitle, 0, start, 1, 1);

        }
        /**
         * 
         * @param scrolledBar    滚动条对象标识
         * @param textview        textview的对象标识
         * @param gridHouse       网格对象的对象标识
         * @param start          textview在网格对象布局的起始位置
         * @purpose              创建textView的滚动条
         */
        public static void createTextviewScrollBar(int scrolledBar,int textview,int gridHouse,int start)
        {
                scrolledBar = GTK.gtk_scrolled_window_new();
                GTK.gtk_widget_show(scrolledBar);
                GTK.gtk_grid_attach(gridHouse, scrolledBar, 0, start, 2, 2);
                GTK.gtk_widget_set_size_request(scrolledBar, 400, 400);
                GTK.gtk_container_add(scrolledBar,textview);
        }
        /**
         * 
         * @param scrolledBar     滚动条对象标识
         * @param textview        textview的对象标识
         * @param gridHouse       网格对象的对象标识
         * @param start          textview在网格对象布局的起始位置
         * @purpose               创建带滚动条的treeview对象标识,用于输出信息
         */
        public static void createTreeviewScrollBar(int scrolledBar,int textview,int gridHouse,int start)
        {
                scrolledBar = GTK.gtk_scrolled_window_new();
                GTK.gtk_widget_show(scrolledBar);
                GTK.gtk_grid_attach(gridHouse, scrolledBar, 0, start, 2, 3);
                GTK.gtk_widget_set_size_request(scrolledBar, 200, 200);
                GTK.gtk_container_add(scrolledBar,textview);
        }
        /**
         * 
         * @param scrolledBar    滚动条对象标识
         * @param textview       textview的对象标识
         * @param gridHouse      网格对象的对象标识
         * @param start          textview在网格对象布局的起始位置
         * @purpose              创建带滚动条的treeview对象标识,用于显示信息
         */
        public static void createTreeviewOutputScrollBar(int scrolledBar,int textview,int gridHouse,int start)
        {
                scrolledBar = GTK.gtk_scrolled_window_new();
                GTK.gtk_widget_show(scrolledBar);
                GTK.gtk_grid_attach(gridHouse, scrolledBar,8, start, 2, 3);
                GTK.gtk_widget_set_size_request(scrolledBar, 200, 200);
                GTK.gtk_container_add(scrolledBar,textview);
        }
        /**
         * 
         * @param window     窗口对象标识
         * @param gridHouse  网格布局对象标识
         * @param start       textview对象在网格布局对象中的起始位置
         * @purpose          创建一个textview的源代码窗口对象
         */
        public static void createSingleTextView(int window, int gridHouse, int start)
        {

                final int tvGirl = GTK.gtk_text_view_new();
                GTK.gtk_text_view_set_wrap_mode(tvGirl, GTK.GTK_WRAP_WORD);
                int scrollBar = 0 ;
                //添加控件
                GTK.gtk_text_view_set_editable(tvGirl, false);
                createTextviewScrollBar(scrollBar,tvGirl,gridHouse,start);
                //GTK.gtk_grid_attach(gridHouse, tvGirl, 0, start+1, 1, 1);

                //显示控件

                GTK.gtk_widget_show(tvGirl);

                String loveWords = "if(!GTK.gtk_tree_model_get_iter_first(liststore.listiter))"
                                + "\n{\n\tSystem.out.println(\"100块钱都不给,真坏!\");\n}\nelse\n{\n\tdo"
                                + "\n\t{\n\t\tSystem.out.println(\"我在do循环里面\");\n\t}while(GTK.gtk_tree_model_iter_next(liststore, iter));"
                                + "\n}\nGTK.gtk_text_iter_free(iter);";
                //读取文本框里面的内容 ,只适用小量的文本,一般用迭代器
                //方法1   先从TextView获取int TextBuffer 
                    //    然后再从TextBuffer获取text
                final int textbuffer= GTK.gtk_text_view_get_buffer(tvGirl);


                //可以直接通过缓冲区编号  设置信息
                GTK.gtk_text_buffer_set_text(textbuffer, loveWords);


        }
        /**
         * 
         * @param window     窗口对象标识(可省略)
         * @param gridHouse  网格对象标识
         * @param start      网格对象的起始位置标识
         * @param tvGirl     treeview对象标识
         * @purpose          创建一个TextView对象标识,加入滚动条,并显示。
         */
        public static void createOutputTextView(int window, int gridHouse, int start,int tvGirl)
        {

                //tvGirl = GTK.gtk_text_view_new();
                GTK.gtk_text_view_set_wrap_mode(tvGirl, GTK.GTK_WRAP_WORD);
                int scrollBar = 0 ;
                //添加控件
                GTK.gtk_text_view_set_editable(tvGirl, false);
                createTreeviewOutputScrollBar(scrollBar,tvGirl,gridHouse,start);
                //GTK.gtk_grid_attach(gridHouse, tvGirl, 0, start+1, 1, 1);

                //显示控件

                GTK.gtk_widget_show(tvGirl);

                String loveWords = "";
                //读取文本框里面的内容 ,只适用小量的文本,一般用迭代器
                //方法1   先从TextView获取int TextBuffer 
                    //    然后再从TextBuffer获取text
                final int textbuffer= GTK.gtk_text_view_get_buffer(tvGirl);


                //可以直接通过缓冲区编号  设置信息
                GTK.gtk_text_buffer_set_text(textbuffer, loveWords);


        }
        /**
         * 
         * @param gridHouse  网格对象标识
         * @param start      网格对象的起始位置标识
         * @purpose          创建一个TreeView对象标识,写入字段,添加记录,加入滚动条,并显示。
         */
        public static void createSingleTreeView(int gridHouse,int start)
        {
                //3  treeview   是一个界面,相当于是一个淘宝前台, V  V的作用
                                treeViewApple = GTK.gtk_tree_view_new();
                                //4 建立字段  比较费劲
                                //4.1创建字段
                                int columnID = GTK.gtk_tree_view_column_new_with_attributes("ID", GTK.gtk_cell_renderer_text_new(), 0);
                                //4.2添加字段
                                GTK.gtk_tree_view_append_column(treeViewApple, columnID);
                                //4.3创建字段
                                int columnName = GTK.gtk_tree_view_column_new_with_attributes("Names",GTK.gtk_cell_renderer_text_new(),1);
                                //4.4添加字段
                                GTK.gtk_tree_view_append_column(treeViewApple,columnName);
                                //4.5创建字段
                                int  columnAge = GTK.gtk_tree_view_column_new_with_attributes("Ages",GTK.gtk_cell_renderer_text_new(),2);
                                GTK.gtk_tree_view_append_column(treeViewApple,columnAge);

                                //创建控件
                                //1  list_store  是一个数据结构库,相当于一个仓库  M model的作用
                                liststore = GTK.gtk_list_store_new(3); //3代表三个字段:ID  Names   Age
                        //        GTK.gtk_list_store_append(list_store, iter);
                                //2  list_iter,list_iter是一个内部的数据迭代的控制过程,不需要显示 C的作用,控制
                                listiter = GTK.gtk_tree_iter_new();

                                //5  第五步 把 iter和listStore联系起来
                                          //GTK.gtk_text_buffer_get_end_iter 类似于treeview的buffer和iter联系起来
                                           // 以后就可以通过GTK.gtk_text_buffer_insert默认是一个一个iter的执行。
                                GTK.gtk_list_store_append(liststore, listiter); //指针开始指到第一个位置
                                // 6 逐个iter添加数据到liststore当中:每个iter的意思,就是逐行或者逐个记录。
                                GTK.gtk_list_store_set_value(liststore, listiter, 0, "001");
                                GTK.gtk_list_store_set_value(liststore, listiter, 1, "YinMuHuaDao");
                                GTK.gtk_list_store_set_value(liststore, listiter, 2, "35");
                                GTK.gtk_list_store_append(liststore, listiter); //如果不加入,指针不下移,只会覆盖掉前面的数据
                                GTK.gtk_list_store_set_value(liststore, listiter, 0, "002");
                                GTK.gtk_list_store_set_value(liststore, listiter, 1, "Taiyanghua");
                                GTK.gtk_list_store_set_value(liststore, listiter, 2, "29");
                                GTK.gtk_list_store_append(liststore, listiter);
                                GTK.gtk_list_store_set_value(liststore, listiter, 0 ,"003");
                                GTK.gtk_list_store_set_value(liststore, listiter, 1 ,"Xiaojun");
                                GTK.gtk_list_store_set_value(liststore, listiter, 2 ,"10");
                                // 之所以添加9次是因为  3个字段*3条记录 == 9

                                //7  使用完iter之后一定要记得 关掉它
                                GTK.gtk_tree_iter_free(listiter);

                                //8 关键的一步,把数字显示出来
                                GTK.gtk_tree_view_set_model(treeViewApple, liststore);

                                //并同时把它显示出来,前台必须显示
                                GTK.gtk_widget_show(treeViewApple);

                                //添加到滚动条中
                                int scrolledbar2 = 0;
                                createTreeviewScrollBar(scrolledbar2,treeViewApple,gridHouse,start);

                                //设置部分参数
                                int column =GTK.gtk_tree_view_get_column(treeViewApple, 1);
                                GTK.gtk_tree_view_column_set_sort_column_id(column, 1);
                                GTK.gtk_tree_view_column_set_resizable(column, true);
                                GTK.gtk_tree_view_column_set_reorderable(column, true);
        }

        /**
         * 
         * @param window          窗口的对象标识
         * @param gridHouse       网格布局的对象标识
         * @param start           对象所在的网格布局起始位置
         * @param circlePointx    画笔的x轴位置
         * @param circlePointy    画笔的y轴位置
         * @purpose               绘制一个笑脸
         */
        public static void createDrawLaughFace(int window,int gridHouse,int start,final int circlePointx,final int circlePointy)
        {
                //创建画图板 或者叫画布
                int dan  = GTK.gtk_drawing_area_new();

                //创建源
                //添加控件
                start = 0;
                GTK.gtk_grid_attach(gridHouse, dan, 1, start, 1, 1);
                //显示画布
                GTK.gtk_widget_show(dan);



                //设置画布的大小
                GTK.gtk_widget_set_size_request(dan, 300, 300);


                //开始绘制  利用事件draw 来不断的绘制

                GTK.g_signal_connect(dan, "draw",new IGCallBack()
                {
                        @Override
                        public void execute(int instance, int eventData, Object object)
                        {
                                // TODO 自动生成的方法存根
                                //eventDate才是画布源
                                //设置画笔的颜色
                                //Cairo.cairo_destroy(eventData);
                                Cairo.cairo_set_source_rgb(eventData, 1, 0, 0);
                                //设置画笔的大小
                                Cairo.cairo_set_line_width(eventData, 3);
                                Cairo.cairo_move_to(eventData, circlePointx-20, circlePointy);
                                Cairo.cairo_line_to(eventData, circlePointx-70, circlePointy);
                                Cairo.cairo_line_to(eventData, circlePointx-60, circlePointy-5);
                                Cairo.cairo_move_to(eventData, circlePointx-70, circlePointy);
                                Cairo.cairo_line_to(eventData, circlePointx-60, circlePointy+5);
                                Cairo.cairo_stroke(eventData);

                                //画一个圆
                                Cairo.cairo_arc(eventData, circlePointx, circlePointy, 10, 0, 2*3.1415926);
                                //画一个圆弧
                                //Cairo.cairo_arc(eventData, 200, 200, 70,1.5*3.1415925, 2*3.1415926);
                                //显示画笔
                                Cairo.cairo_stroke(eventData); //Cairo.cairo_fill(eventData)不同的效果


                                //画一个圆弧  有下面实验知道是从x轴沿顺时针开始画图

                                //嘴巴的绘制
                                double Pi = 3.1415926;
                                Cairo.cairo_arc(eventData, circlePointx, circlePointy, 5, 0.25*Pi, 0.75*Pi);
                                Cairo.cairo_fill(eventData);

                                //绘制两只眼睛
                                Cairo.cairo_arc(eventData, circlePointx-5, circlePointy-5, 3, 0, 2*Pi);
                                Cairo.cairo_arc(eventData, circlePointx+5, circlePointy-5, 3, 0, 2*Pi);
                                Cairo.cairo_fill(eventData);



                                //画文字
                                Cairo.cairo_move_to(eventData, circlePointx+10, circlePointy+5);
                                Cairo.cairo_set_source_rgb(eventData, 0.4, 0.3, 0.2);
                                Cairo.cairo_set_font_size(eventData, 16);
                                //选择文字类型
                                Cairo.cairo_select_font_face(eventData, "宋体", Cairo.CAIRO_FONT_SLANT_ITALIC, Cairo.CAIRO_FONT_WEIGHT_BOLD);
                                Cairo.cairo_show_text(eventData,note);
                                //Cairo.cairo_stroke(eventData);  //不需要这句话也可以

                        }
                }, null);


        }
        /**
         * 
         * @param window          窗口的对象标识
         * @param gridHouse       网格布局的对象标识
         * @param start           矩形对象所在的网格布局起始位置
         * @param circlePointx    画笔的x轴位置
         * @param circlePointy    画笔的y轴位置
         * @purpose               绘制一个矩形图像
         */
        public static void createRectangleFace(int window,int gridHouse,int start,final int circlePointx,final int circlePointy)
        {
                //创建画图板 或者叫画布
                int dan  = GTK.gtk_drawing_area_new();

                //创建源
                //添加控件
                start = 4;
                GTK.gtk_grid_attach(gridHouse, dan, 0, start, 1, 1);
                //显示画布
                GTK.gtk_widget_show(dan);



                //设置画布的大小
                GTK.gtk_widget_set_size_request(dan, 300, 300);


                //开始绘制  利用事件draw 来不断的绘制

                GTK.g_signal_connect(dan, "draw",new IGCallBack()
                {
                        @Override
                        public void execute(int instance, int eventData, Object object)
                        {
                                // TODO 自动生成的方法存根
                                //eventDate才是画布源
                                //设置画笔的颜色
                                //Cairo.cairo_destroy(eventData);
                                Cairo.cairo_set_source_rgb(eventData, 0, 1, 0);
                                //设置画笔的大小
                                Cairo.cairo_set_line_width(eventData, 3);
                                //Cairo.cairo_move_to(eventData, circlePointx-20, circlePointy);


                                //画一个矩形
                                Cairo.cairo_rectangle(eventData, circleRectangex-150, circleRectangey+120, 250, 20);
                                Cairo.cairo_stroke(eventData);
                                //画文字
                                Cairo.cairo_move_to(eventData, circleRectangex+10, circleRectangey+100);
                                Cairo.cairo_set_source_rgb(eventData, 0, 0, 1);
                                Cairo.cairo_set_font_size(eventData, 18);
                                //选择文字类型
                                Cairo.cairo_select_font_face(eventData, "宋体", Cairo.CAIRO_FONT_SLANT_NORMAL, Cairo.CAIRO_FONT_WEIGHT_BOLD);
                                Cairo.cairo_show_text(eventData,"循环第"+Integer.toString(rowPosition)+"次");//
                                //Cairo.cairo_stroke(eventData);  //不需要这句话也可以

                        }
                }, null);


        }
        /**
         * 
         * @param window          窗口的对象标识
         * @param gridHouse       网格布局的对象标识
         * @param start           矩形对象所在的网格布局起始位置
         * @param circlePointx    画笔的x轴位置
         * @param circlePointy    画笔的y轴位置
         * @purpose               绘制一个圆圈图像 + 终止表示!
         */
        public static void createCircleFace(int window,int gridHouse,int start,final int circlePointx,final int circlePointy)
        {
                //创建画图板 或者叫画布
                int dan  = GTK.gtk_drawing_area_new();

                //创建源
                //添加控件
                start = 4;
                GTK.gtk_grid_attach(gridHouse, dan, 0, start, 1, 1);
                //显示画布
                GTK.gtk_widget_show(dan);



                //设置画布的大小
                GTK.gtk_widget_set_size_request(dan, 300, 300);


                //开始绘制  利用事件draw 来不断的绘制

                GTK.g_signal_connect(dan, "draw",new IGCallBack()
                {
                        @Override
                        public void execute(int instance, int eventData, Object object)
                        {
                                // TODO 自动生成的方法存根
                                //eventDate才是画布源
                                //设置画笔的颜色
                                //Cairo.cairo_destroy(eventData);
                                Cairo.cairo_set_source_rgb(eventData, 1, 0, 1);
                                //设置画笔的大小
                                Cairo.cairo_set_line_width(eventData, 3);
                                //Cairo.cairo_move_to(eventData, circlePointx-20, circlePointy);


                                //画一个矩形
                                Cairo.cairo_arc(eventData, EndCirclex+150, EndCircley+200, 100, 0, 6.28);
                                Cairo.cairo_stroke(eventData);
                                //画文字
                                Cairo.cairo_move_to(eventData, EndCirclex+50, EndCircley+200);
                                Cairo.cairo_set_source_rgb(eventData, 1, 0, 1);
                                Cairo.cairo_set_font_size(eventData, 18);
                                //选择文字类型
                                Cairo.cairo_select_font_face(eventData, "宋体", Cairo.CAIRO_FONT_SLANT_NORMAL, Cairo.CAIRO_FONT_WEIGHT_BOLD);
                                Cairo.cairo_show_text(eventData,"循环第"+Integer.toString(rowPosition+1)+"次,程序终止退出!");//
                                //Cairo.cairo_stroke(eventData);  //不需要这句话也可以

                        }
                }, null);


        }
        /**
         * 
         * @param gridHouse         网格布局对象标识
         * @param textViewOutput    textview的对象标识
         * @param start             textview对象在网格布局的起始位置
         * @purpose                 创建一个下一步button,并添加事件监听
         */
        public static void createNextButton(int gridHouse,int textViewOutput,int start)
        {
                int btnApple = GTK.gtk_button_new_with_label("下一步");
                GTK.gtk_widget_show(btnApple);
                GTK.gtk_grid_attach(gridHouse, btnApple, 6, start, 1, 1);
                insertNextEvent(btnApple,textViewOutput);
        }
        /**
         * 
         * @param btnSin            button下一步的对象标识
         * @param textViewOutput    textview的对象标识
         * @purpose                 建立button下一步的事件监听
         */
        public static void insertNextEvent(final int btnSin,final int textViewOutput)
        {
                GTK.g_signal_connect(btnSin, "clicked",new IGCallBack()
                {
                        @Override
                        public void execute(int instance, int eventData, Object object)
                        {

                                // TODO 自动生成的方法存根
                                //double sbValue = GTK.gtk_spin_button_get_value(spinbox);
                                if(rowPosition < getNumberOfListstore(liststore))
                                {
                                        circlePointy = circlePointy+20;
                                        //创建笑脸
                                        createDrawLaughFace(window,gridHouse,start,circlePointx,circlePointy);
                                        //创建矩形框
                                        createRectangleFace(window,gridHouse,start+1,circleRectangex,circleRectangey);
                                        printRecord(liststore);
                                        InsertStringToTextViewFunction(textViewOutput,"我在do循环里面  \n");
                                        rowPosition =  rowPosition +1;
                                }
                                else
                                {

                                        //note = "指针无法下移";
                                        circlePointy = circlePointy+20;
                                        if(rowPosition > getNumberOfListstore(liststore))
                                        {
                                                createDrawLaughFace(window,gridHouse,start,circlePointx,circlePointy);
                                        }

                                        createRectangleFace(window,gridHouse,start+1,circleRectangex,circleRectangey);
                                        createCircleFace(window,gridHouse,start,EndCirclex,EndCircley);
                                        InsertStringToTextViewFunction(textViewOutput,"别嗯了!程序没有数据了\n");
                                        showInfo("没有数据了","指针无法下移");
                                }

                        }
                }, null);
        }
        /**
         * 
         * @param liststore   liststore是treeview的原始数据
         * @return            返回liststore的记录个数
         */
        public static int getNumberOfListstore(int liststore)
        {
                int sum = 0;
                int iter = GTK.gtk_tree_iter_new();
                if(!GTK.gtk_tree_model_get_iter_first(liststore, iter))
                {
                        return sum;
                }
                do
                {
                        sum++;
                }while(GTK.gtk_tree_model_iter_next(liststore, iter));
                return sum;
        }
        /**
         * 
         * @param liststore   liststore是treeview的原始数据
         * @purpose           打印liststore的所有内容
         */
        public static void printRecord(int liststore)
        {
                //必须新建,不能利用原先的listiter,哪边需要用控制,就需要建一个控件。!!!否则报错!!不能用全局的 listiter
                int iter = GTK.gtk_tree_iter_new();
                int i  =0;
/*                if(GTK.gtk_tree_model_get_iter_first(liststore, listiter))
                {
                        do
                        {
                                String ID = GTK.gtk_tree_model_get_value(liststore, listiter, 0);
                                String Names = GTK.gtk_tree_model_get_value(liststore, listiter, 1);
                                String Ages = GTK.gtk_tree_model_get_value(liststore, listiter, 2);
                                //showInfo("这个员工的ID是"+ID+",他的名字是"+Names+",并且它的年龄是"+Ages,"显示员工信息");
                                System.out.println("这个员工的ID是"+ID+",他的名字是"+Names+",并且它的年龄是"+Ages);
                                
                        }while(GTK.gtk_tree_model_iter_next(liststore,listiter));
                }else
                {
                        System.out.println("表中无数据");
                }*/
                // 减少代码的深度。
                if(!GTK.gtk_tree_model_get_iter_first(liststore, iter))
                {
                        System.out.println("treeview没有数据  请添加记录");
                        return;
                }
                do
                {
                        if(rowPosition == i)
                        {
                                String ID = GTK.gtk_tree_model_get_value(liststore, iter, 0);
                                String Names = GTK.gtk_tree_model_get_value(liststore, iter, 1);
                                String Ages = GTK.gtk_tree_model_get_value(liststore, iter, 2);
                                showInfo("这个员工的ID是"+ID+",他的名字是"+Names+",并且它的年龄是"+Ages,"显示员工信息");
                                //System.out.println("这个员工的ID是"+ID+",他的名字是"+Names+",并且它的年龄是"+Ages);
                                return;
                        }
                        i++;

                }while(GTK.gtk_tree_model_iter_next(liststore,iter));

                GTK.gtk_tree_iter_free(iter);//释放了 还是有错误。。。
        }
        /**
         * 
         * @param message    输入一个消息,显示在消息框
         * @param title      消息框的标题
         * @purpose          创建一个消息提示对话框
         */
        public static void showInfo(  String  message,String title)
        {
                int msgDlg = GTK.gtk_message_dialog_new(0, GTK.GTK_DIALOG_DESTROY_WITH_PARENT|
                                GTK.GTK_DIALOG_MODAL,GTK.GTK_MESSAGE_INFO, GTK.GTK_BUTTONS_OK,message);
                GTK.gtk_window_set_title(msgDlg, title);
                int ret = GTK.gtk_dialog_run(msgDlg);

                if( ret == GTK.GTK_RESPONSE_OK)
                {
                        GTK.gtk_widget_destroy(msgDlg);
                }else
                {
                        GTK.gtk_widget_destroy(msgDlg);
                }

        }

        public static void createSelection(int gridHouse,int start)
        {

        }
        /**
         * 
         * @param textview   textview对象标识
         * @param temp       待插入textview的字符串
         * @purpose          插入一行数据岛textview当中
         */
        public static void InsertStringToTextViewFunction(int textview,String temp)
        {
                //TextIter是一个TextView的迭代器。
                int textBuffer =  GTK.gtk_text_view_get_buffer(textview);
                int textIter = GTK.gtk_text_iter_new();  //这是一个空的iter,需要用textBuffer进行赋值
                //GTK.gtk_text_iter_forward_to_end(textIter);
                GTK.gtk_text_buffer_get_end_iter(textBuffer, textIter);// 或者textview的textBuffer的末尾!
                GTK.gtk_text_buffer_insert(textBuffer, textIter, temp);

                //GTK.gtk_text_buffer_g
                GTK.gtk_text_iter_free(textIter);

        }


}

复制代码

有什么意见,欢迎交流,有什么想法,欢迎交流。~–~

初始时刻 运行第一次 程序结束