本文实例讲述了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.zzvips.com" ); //添加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