本文實例講述了java swing中jtable渲染器與編輯器用法。分享給大家供大家參考,具體如下:
jtable的內容、外觀、事件響應在很大程度上是由渲染器與編輯器控制的。具體說來,渲染器負責單元格的外觀比如前景色、背景色,以及單元格提示;編輯器負責單元格的內容和事件響應。編輯器默認為文本框形式,也可以使用下拉菜單、按鈕、單選按鈕等形式。下面通過一個demo程序來說明渲染器與編輯器的基本用法。
jbuttontableexample.java
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
|
package awtdemo; import java.awt.event.windowadapter; import java.awt.event.windowevent; import javax.swing.jcheckbox; import javax.swing.jframe; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.table.defaulttablemodel; @suppresswarnings ( "serial" ) public class jbuttontableexample extends jframe { public jbuttontableexample() { super ( "jbuttontable example - www.ythuaji.com.cn" ); //添加tablemodel以及表格數據 defaulttablemodel dm = new defaulttablemodel(); dm.setdatavector( new object[][] { { "button 1" , "foo" }, { "button 2" , "bar" } }, new object[] { "button" , "string" }); jtable table = new jtable(dm); //添加渲染器 table.getcolumn( "button" ).setcellrenderer( new buttonrenderer()); //添加編輯器 table.getcolumn( "button" ).setcelleditor( new buttoneditor( new jcheckbox())); //gui設置 jscrollpane scroll = new jscrollpane(table); getcontentpane().add(scroll); setsize( 400 , 100 ); setvisible( true ); } public static void main(string[] args) { jbuttontableexample frame = new jbuttontableexample(); frame.addwindowlistener( new windowadapter() { public void windowclosing(windowevent e) { system.exit( 0 ); } }); } } |
以上是主程序,構造了gui、table以及model。并設置了table的渲染器和編輯器。
buttonrenderer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package awtdemo; import java.awt.color; import javax.swing.jbutton; import javax.swing.jcomponent; import javax.swing.jtable; import javax.swing.table.tablecellrenderer; @suppresswarnings ( "serial" ) class buttonrenderer extends jbutton implements tablecellrenderer { public jcomponent gettablecellrenderercomponent(jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { //value 源于editor string text = (value == null ) ? "" : value.tostring(); //按鈕文字 settext(text); //單元格提示 settooltiptext(text); //背景色 setbackground(color.black); //前景色 setforeground(color.green); return this ; } } |
定制的渲染器必須實現tablecellrenderer及gettablecellrenderercomponent方法。在該方法中,可以指定渲染器的文字、單元格提示、顏色、字體等。注意,此處的文字僅為顯示的內容,不是單元格的實際數據。
buttoneditor.java
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
|
package awtdemo; import java.awt.event.actionevent; import java.awt.event.actionlistener; import javax.swing.defaultcelleditor; import javax.swing.jbutton; import javax.swing.jcheckbox; import javax.swing.jcomponent; import javax.swing.joptionpane; import javax.swing.jtable; @suppresswarnings ( "serial" ) class buttoneditor extends defaultcelleditor { protected jbutton button; //represent the celleditorcomponent private string cellvalue; //保存celleditorvalue public buttoneditor(jcheckbox checkbox) { super (checkbox); button = new jbutton(); button.setopaque( true ); button.addactionlistener( new actionlistener() { public void actionperformed(actionevent e) { joptionpane.showmessagedialog(button, cellvalue + ": ouch!" ); //刷新渲染器 fireeditingstopped(); } }); } public jcomponent gettablecelleditorcomponent(jtable table, object value, boolean isselected, int row, int column) { //value 源于單元格數值 cellvalue = (value == null ) ? "" : value.tostring(); return button; } public object getcelleditorvalue() { return new string(cellvalue); } } |
本編輯器實現了一個按鈕,相應的業務代碼均位于其事件響應函數中。定制的渲染器必須繼承defaultcelleditor,并重載其gettablecelleditorcomponent方法。gettablecelleditorcomponent的參數提供了表格對象、單元格數值、單元格選中標志以及單元格的坐標,并返回代表該單元格的渲染器的jcomponent組件。在該方法中,我們將單元格數值保存為成員變量cellvalue,并返回一個按鈕。getcelleditorvalue方法用于返回單元格數值,需要我們顯示地指定。在按鈕的事件響應函數中,本demo通過彈出對話框輸出了相應的單元格數值。然后,調用了fireeditingstopped方法刷新渲染器。注意,該步驟不必可少,因為渲染器中的業務代碼很有可能改變單元格數值,從而導致渲染器必須進行刷新。
運行效果如下:
點擊button1后的效果如下:
希望本文所述對大家java程序設計有所幫助。
原文鏈接:http://www.cnblogs.com/pzy4447/p/5155051.html