本文實(shí)例講述了java swing組件編程之jtable表格用法。分享給大家供大家參考,具體如下:
表格是gui編程中使用較多,但也是最麻煩的一個(gè)控件之一。表格是用來顯示二維數(shù)據(jù),提供編輯,選擇等功能。如果只是顯示數(shù)據(jù),這還是非常easy的,只要在jtable中傳入二維數(shù)組或集合就可以了。
示例1:
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
|
package awtdemo; import javax.swing.jframe; import javax.swing.jscrollpane; import javax.swing.jtable; public class simpletable { jframe jf = new jframe( "簡(jiǎn)單表格 - www.ythuaji.com.cn" ); jtable table; //定義二維數(shù)組作為表格數(shù)據(jù) object[][] tabledata = { new object[]{ "李清照" , 29 , "女" }, new object[]{ "蘇格拉底" , 56 , "男" }, new object[]{ "李白" , 35 , "男" }, new object[]{ "弄玉" , 18 , "女" }, new object[]{ "虎頭" , 2 , "男" } }; //定義一維數(shù)據(jù)作為列標(biāo)題 object[] columntitle = { "姓名" , "年齡" , "性別" }; public void init() { //以二維數(shù)組和一維數(shù)組來創(chuàng)建一個(gè)jtable對(duì)象 table = new jtable(tabledata , columntitle); //將jtable對(duì)象放在jscrollpane中,并將該jscrollpane放在窗口中顯示出來 jf.add( new jscrollpane(table)); jf.pack(); jf.setdefaultcloseoperation(jframe.exit_on_close); jf.setvisible( true ); } public static void main(string[] args) { new simpletable().init(); } } |
運(yùn)行效果:
下面舉個(gè)jtable表格調(diào)整和選擇方式的例子。
示例2:
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
|
package awtdemo; import java.awt.event.actionevent; import java.awt.event.actionlistener; import javax.swing.buttongroup; import javax.swing.jcheckboxmenuitem; import javax.swing.jframe; import javax.swing.jmenu; import javax.swing.jmenubar; import javax.swing.jradiobuttonmenuitem; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.listselectionmodel; import javax.swing.table.tablecolumn; public class adjustingwidth { jframe jf = new jframe( "調(diào)整表格列寬 - www.ythuaji.com.cn" ); jmenubar menubar = new jmenubar(); jmenu adjustmodemenu = new jmenu( "調(diào)整方式" ); jmenu selectunitmenu = new jmenu( "選擇單元" ); jmenu selectmodemenu = new jmenu( "選擇方式" ); //定義5個(gè)單選框按鈕,用以控制表格的寬度調(diào)整方式 jradiobuttonmenuitem[] adjustmodesitem = new jradiobuttonmenuitem[ 5 ]; //定義3個(gè)單選框按鈕,用以控制表格的選擇方式 jradiobuttonmenuitem[] selectmodesitem = new jradiobuttonmenuitem[ 3 ]; jcheckboxmenuitem rowsitem = new jcheckboxmenuitem( "選擇行" ); jcheckboxmenuitem columnsitem = new jcheckboxmenuitem( "選擇列" ); jcheckboxmenuitem cellsitem = new jcheckboxmenuitem( "選擇單元格" ); buttongroup adjustbg = new buttongroup(); buttongroup selectbg = new buttongroup(); //定義一個(gè)int類型的數(shù)組,用于保存表格所有的寬度調(diào)整方式 int [] adjustmodes = new int []{ jtable.auto_resize_off, jtable.auto_resize_next_column, jtable.auto_resize_subsequent_columns, jtable.auto_resize_last_column, jtable.auto_resize_all_columns }; int [] selectmodes = new int []{ listselectionmodel.multiple_interval_selection , listselectionmodel.single_interval_selection , listselectionmodel.single_selection }; jtable table; //定義二維數(shù)組作為表格數(shù)據(jù) object[][] tabledata = { new object[]{ "李清照" , 29 , "女" }, new object[]{ "蘇格拉底" , 56 , "男" }, new object[]{ "李白" , 35 , "男" }, new object[]{ "弄玉" , 18 , "女" }, new object[]{ "虎頭" , 2 , "男" } }; //定義一維數(shù)據(jù)作為列標(biāo)題 object[] columntitle = { "姓名" , "年齡" , "性別" }; public void init() { //以二維數(shù)組和一維數(shù)組來創(chuàng)建一個(gè)jtable對(duì)象 table = new jtable(tabledata , columntitle); //-----------為窗口安裝設(shè)置表格調(diào)整方式的菜單----------- adjustmodesitem[ 0 ] = new jradiobuttonmenuitem( "只調(diào)整表格" ); adjustmodesitem[ 1 ] = new jradiobuttonmenuitem( "只調(diào)整下一列" ); adjustmodesitem[ 2 ] = new jradiobuttonmenuitem( "平均調(diào)整余下列" ); adjustmodesitem[ 3 ] = new jradiobuttonmenuitem( "只調(diào)整最后一列" ); adjustmodesitem[ 4 ] = new jradiobuttonmenuitem( "平均調(diào)整所有列" ); menubar.add(adjustmodemenu); for ( int i = 0 ; i < adjustmodesitem.length ; i++) { //默認(rèn)選中第三個(gè)菜單項(xiàng),即對(duì)應(yīng)表格默認(rèn)的寬度調(diào)整方式 if (i == 2 ) { adjustmodesitem[i].setselected( true ); } adjustbg.add(adjustmodesitem[i]); adjustmodemenu.add(adjustmodesitem[i]); final int index = i; //為設(shè)置調(diào)整方式的菜單項(xiàng)添加監(jiān)聽器 adjustmodesitem[i].addactionlistener( new actionlistener() { public void actionperformed(actionevent evt) { //如果當(dāng)前菜單項(xiàng)處于選中狀態(tài),表格使用對(duì)應(yīng)的調(diào)整方式 if (adjustmodesitem[index].isselected()) { table.setautoresizemode(adjustmodes[index]); } } public void actionperformed1(actionevent e) { // todo 自動(dòng)生成的方法存根 } }); } //-----------為窗口安裝設(shè)置表格選擇方式的菜單----------- selectmodesitem[ 0 ] = new jradiobuttonmenuitem( "無限制" ); selectmodesitem[ 1 ] = new jradiobuttonmenuitem( "單獨(dú)的連續(xù)區(qū)" ); selectmodesitem[ 2 ] = new jradiobuttonmenuitem( "單選" ); menubar.add(selectmodemenu); for ( int i = 0 ; i < selectmodesitem.length ; i++) { //默認(rèn)選中第一個(gè)菜單項(xiàng),即對(duì)應(yīng)表格默認(rèn)的選擇方式 if (i == 0 ) { selectmodesitem[i].setselected( true ); } selectbg.add(selectmodesitem[i]); selectmodemenu.add(selectmodesitem[i]); final int index = i; //為設(shè)置選擇方式的菜單項(xiàng)添加監(jiān)聽器 selectmodesitem[i].addactionlistener( new actionlistener() { public void actionperformed(actionevent evt) { //如果當(dāng)前菜單項(xiàng)處于選中狀態(tài),表格使用對(duì)應(yīng)的選擇方式 if (selectmodesitem[index].isselected()) { table.getselectionmodel().setselectionmode(selectmodes[index]); } } }); } menubar.add(selectunitmenu); //-----------為窗口安裝設(shè)置表格選擇單元的菜單----------- rowsitem.setselected(table.getrowselectionallowed()); columnsitem.setselected(table.getcolumnselectionallowed()); cellsitem.setselected(table.getcellselectionenabled()); rowsitem.addactionlistener( new actionlistener() { public void actionperformed(actionevent event) { table.clearselection(); //如果該菜單項(xiàng)處于選中狀態(tài),設(shè)置表格的選擇單元是行 table.setrowselectionallowed(rowsitem.isselected()); //如果選擇行、選擇列同時(shí)被選中,其實(shí)質(zhì)是選擇單元格 cellsitem.setselected(table.getcellselectionenabled()); } }); selectunitmenu.add(rowsitem); columnsitem.addactionlistener( new actionlistener() { public void actionperformed(actionevent event) { table.clearselection(); //如果該菜單項(xiàng)處于選中狀態(tài),設(shè)置表格的選擇單元是列 table.setcolumnselectionallowed(columnsitem.isselected()); //如果選擇行、選擇列同時(shí)被選中,其實(shí)質(zhì)是選擇單元格 cellsitem.setselected(table.getcellselectionenabled()); } }); selectunitmenu.add(columnsitem); cellsitem.addactionlistener( new actionlistener() { public void actionperformed(actionevent event) { table.clearselection(); //如果該菜單項(xiàng)處于選中狀態(tài),設(shè)置表格的選擇單元是單元格 table.setcellselectionenabled(cellsitem.isselected()); //該選項(xiàng)的改變會(huì)同時(shí)影響選擇行、選擇列兩個(gè)菜單 rowsitem.setselected(table.getrowselectionallowed()); columnsitem.setselected(table.getcolumnselectionallowed()); } }); selectunitmenu.add(cellsitem); jf.setjmenubar(menubar); //分別獲取表格的三個(gè)表格列,并設(shè)置三列的最小寬度,最佳寬度和最大寬度 tablecolumn namecolumn = table.getcolumn(columntitle[ 0 ]); namecolumn.setminwidth( 40 ); tablecolumn agecolumn = table.getcolumn(columntitle[ 1 ]); agecolumn.setpreferredwidth( 50 ); tablecolumn gendercolumn = table.getcolumn(columntitle[ 2 ]); gendercolumn.setmaxwidth( 50 ); //將jtable對(duì)象放在jscrollpane中,并將該jscrollpane放在窗口中顯示出來 jf.add( new jscrollpane(table)); system.out.println(table.getmodel()); jf.pack(); jf.setdefaultcloseoperation(jframe.exit_on_close); jf.setvisible( true ); } public static void main(string[] args) { new adjustingwidth().init(); } } |
運(yùn)行效果:
和jlist,jtree類似,jtable采用tablemodel來保存表格中的所有狀態(tài)數(shù)據(jù),采用tablecolumnmodel來保存所有列的數(shù)據(jù)。
示例3:
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
|
package awtdemo; import java.awt.borderlayout; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.util.arraylist; import javax.swing.jframe; import javax.swing.jmenu; import javax.swing.jmenubar; import javax.swing.jmenuitem; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.table.defaulttablemodel; import javax.swing.table.tablecolumn; import javax.swing.table.tablecolumnmodel; public class testdefaulttablemodel { jframe mainwin = new jframe( "管理數(shù)據(jù)行、數(shù)據(jù)列 - www.ythuaji.com.cn" ); final int column_count = 5 ; defaulttablemodel model; jtable table; //用于保存被隱藏列的list集合 arraylist<tablecolumn> hiddencolumns = new arraylist<tablecolumn>(); public void init() { model = new defaulttablemodel(column_count ,column_count); for ( int i = 0 ; i < column_count ; i++ ) { for ( int j = 0 ; j < column_count ; j++ ) { model.setvalueat( "老單元格值 " + i + " " + j , i , j); } } table = new jtable(model); mainwin.add( new jscrollpane(table), borderlayout.center); //為窗口安裝菜單 jmenubar menubar = new jmenubar(); mainwin.setjmenubar(menubar); jmenu tablemenu = new jmenu( "管理" ); menubar.add(tablemenu); jmenuitem hidecolumnsitem = new jmenuitem( "隱藏選中列" ); hidecolumnsitem.addactionlistener( new actionlistener() { public void actionperformed1(actionevent event) { //獲取所有選中列的索引 int [] selected = table.getselectedcolumns(); tablecolumnmodel columnmodel = table.getcolumnmodel(); //依次把每一個(gè)選中的列隱藏起來,并使用list把這些列保存起來 for ( int i = selected.length - 1 ; i >= 0 ; i--) { tablecolumn column = columnmodel.getcolumn(selected[i]); table.removecolumn(column); //把隱藏的列保存起來,確保以后可以顯示出來 hiddencolumns.add(column); } } @override public void actionperformed(actionevent e) { // todo 自動(dòng)生成的方法存根 } }); tablemenu.add(hidecolumnsitem); jmenuitem showcolumnsitem = new jmenuitem( "顯示隱藏列" ); showcolumnsitem.addactionlistener( new actionlistener() { public void actionperformed(actionevent event) { //把所有隱藏列依次顯示出來 for (tablecolumn tc : hiddencolumns) { //依次把所有隱藏的列顯示出來 table.addcolumn(tc); } //清空保存隱藏列的list集合 hiddencolumns.clear(); } }); tablemenu.add(showcolumnsitem); jmenuitem addcolumnitem = new jmenuitem( "插入選中列" ); addcolumnitem.addactionlistener( new actionlistener() { public void actionperformed(actionevent event) { //獲取所有選中列的索引 int [] selected = table.getselectedcolumns(); tablecolumnmodel columnmodel = table.getcolumnmodel(); //依次把選中的列添加到j(luò)table之后 for ( int i = selected.length - 1 ; i >= 0 ; i--) { tablecolumn column = columnmodel.getcolumn(selected[i]); table.addcolumn(column); } } }); tablemenu.add(addcolumnitem); jmenuitem addrowitem = new jmenuitem( "增加行" ); addrowitem.addactionlistener( new actionlistener() { public void actionperformed(actionevent event) { //創(chuàng)建一個(gè)string數(shù)組作為新增行的內(nèi)容 string[] newcells = new string[column_count]; for ( int i = 0 ; i < newcells.length; i++) { newcells[i] = "新單元格值 " + model.getrowcount() + " " + i; } //向tablemodel中新增一行。 model.addrow(newcells); } }); tablemenu.add(addrowitem); jmenuitem removerowsitem = new jmenuitem( "刪除選中行" ); removerowsitem.addactionlistener( new actionlistener() { public void actionperformed(actionevent event) { //獲取所有選中行 int [] selected = table.getselectedrows(); //依次刪除所有選中行 for ( int i = selected.length - 1 ; i >= 0 ; i--) { model.removerow(selected[i]); } } }); tablemenu.add(removerowsitem); mainwin.pack(); mainwin.setdefaultcloseoperation(jframe.exit_on_close); mainwin.setvisible( true ); } public static void main(string[] args) { new testdefaulttablemodel().init(); } } |
運(yùn)行效果:
但要注意列的增加,只是將原來隱藏的列顯示,而不是真正增加列,你要新增的話那就重新new個(gè)jtable
前面講的表格,單元格都是字符串,這是由于我們傳入的都是defaulttablemodel它最終調(diào)用tostring方法來繪制表格,具體自定義單元格的方法如下,
示例4:
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
|
public class testtablecellrenderer { jframe jf = new jframe( "使用單元格繪制器" ); jtable table; //定義二維數(shù)組作為表格數(shù)據(jù) object[][] tabledata = { new object[]{ "李清照" , 29 , "女" , new imageicon( "icon/3.gif" ) , true }, new object[]{ "蘇格拉底" , 56 , "男" , new imageicon( "icon/1.gif" ) , false }, new object[]{ "李白" , 35 , "男" , new imageicon( "icon/4.gif" ) , true }, new object[]{ "弄玉" , 18 , "女" , new imageicon( "icon/2.gif" ) , true }, new object[]{ "虎頭" , 2 , "男" , new imageicon( "icon/5.gif" ) , true } }; //定義一維數(shù)據(jù)作為列標(biāo)題 string[] columntitle = { "姓名" , "年齡" , "性別" , "主頭像" , "是否中國人" }; public void init() { //以二維數(shù)組和一維數(shù)組來創(chuàng)建一個(gè)extendedtablemodel對(duì)象 extendedtablemodel model = new extendedtablemodel(columntitle , tabledata); //以extendedtablemodel來創(chuàng)建jtable table = new jtable( model); table.setrowselectionallowed( false ); table.setrowheight( 40 ); //獲取第三列 tablecolumn lastcolumn = table.getcolumnmodel().getcolumn( 2 ); //對(duì)第三列采用自定義的單元格繪制器 lastcolumn.setcellrenderer( new gendertablecellrenderer()); //將jtable對(duì)象放在jscrollpane中,并將該jscrollpane放在窗口中顯示出來 jf.add( new jscrollpane(table)); jf.pack(); jf.setdefaultcloseoperation(jframe.exit_on_close); jf.setvisible( true ); } public static void main(string[] args) { new testtablecellrenderer().init(); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class extendedtablemodel extends defaulttablemodel { //重新提供一個(gè)構(gòu)造器,該構(gòu)造器的實(shí)現(xiàn)委托給defaulttablemodel父類 public extendedtablemodel(string[] columnnames , object[][] cells) { super (cells , columnnames); } //重寫getcolumnclass方法,根據(jù)每列的第一個(gè)值來返回其真實(shí)的數(shù)據(jù)類型 public class getcolumnclass( int c) { return getvalueat( 0 , c).getclass(); } } |
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
|
class gendertablecellrenderer extends jpanel implements tablecellrenderer { private string cellvalue; //定義圖標(biāo)的寬度和高度 final int icon_width = 23 ; final int icon_height = 21 ; public component gettablecellrenderercomponent(jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { cellvalue = (string)value; //設(shè)置選中狀態(tài)下繪制邊框 if (hasfocus) { setborder(uimanager.getborder( "table.focuscellhighlightborder" )); } else { setborder( null ); } return this ; } //重寫paint方法,負(fù)責(zé)繪制該單元格內(nèi)容 public void paint(graphics g) { //如果表格值為"男"或"male",則繪制一個(gè)男性圖標(biāo) if (cellvalue.equalsignorecase( "男" ) || cellvalue.equalsignorecase( "male" )) { drawimage(g , new imageicon( "icon/male.gif" ).getimage()); } //如果表格值為"女"或"female",則繪制一個(gè)女性圖標(biāo) if (cellvalue.equalsignorecase( "女" ) || cellvalue.equalsignorecase( "female" )) { drawimage(g , new imageicon( "icon/female.gif" ).getimage()); } } //繪制圖標(biāo)的方法 private void drawimage(graphics g , image image) { g.drawimage(image, (getwidth() - icon_width ) / 2 , (getheight() - icon_height) / 2 , null ); } } |
我這里只是實(shí)現(xiàn)了每列不同的控件,大家還可以自定義一個(gè)表格每行每列都是不同的控件,那就要得到單元格再setcellrender。
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
原文鏈接:http://blog.csdn.net/tototuzuoquan/article/details/8982538