You are on page 1of 7

JTablecolumnheadercustomrendererexamples

http://javatipseveryday.comABrandNewCoursethatHelpsYouTurnYourselfintoaJavaExpertWithinOneYear!
LastUpdatedon17April2014|

Print

MEmail

ThisarticleshowshowtocreatecustomrenderersforcolumnheadersinaJTable.HeresacoupleofexamplesofJTablewithitscolumnheaders
customized:

AJTablewithallcolumnheaderscustomizedwithasamerenderer

AJTablewithmultirenderersfordifferentcolumnheaders
BasicallywecreateacustomrendererbywritingaclassthatimplementstheTableCellRenderinterfaceandextendsaSwingcomponent(e.g.JLabel)
likethis:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

publicclassSimpleHeaderRendererextendsJLabelimplementsTableCellRenderer{

publicSimpleHeaderRenderer(){
//codetoinitilizetheGUI...
}

@Override
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,
booleanisSelected,booleanhasFocus,introw,intcolumn){

//codetocustomizetheGUIbasedontheparameters

returnthis;
}

Thenwesetthisrendererforallcolumnheadersinthetablelikethis:
1

table.getTableHeader().setDefaultRenderer(newSimpleHeaderRenderer());

Orsetthisrendererforaspecificcolumn,e.g.the3rdcolumninthisexample:
1

table.getColumnModel().getColumn(2).setHeaderRenderer(newSimpleHeaderRenderer());

Nowletsseehowtocreatetableswithcustomrenderersthatlookliketheabovescreenshots.

LearnSwinginSwing:ABeginner'sGuide

1.Asimplecustomrendererforallcolumnheaders
ThisexampleshowshowtocreateacustomrendererandapplyitforallcolumnheadersofaJTable.
Codeoftherendererclass,SimpleHeaderRenderer.java:
1

packagenet.codejava.swing.jtable;

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

importjava.awt.Color;
importjava.awt.Component;
importjava.awt.Font;

importjavax.swing.BorderFactory;
importjavax.swing.JLabel;
importjavax.swing.JTable;
importjavax.swing.table.TableCellRenderer;

/**
*AsimplerendererclassforJTablecomponent.
*@authorwww.codejava.net
*
*/
publicclassSimpleHeaderRendererextendsJLabelimplementsTableCellRenderer{

publicSimpleHeaderRenderer(){
setFont(newFont("Consolas",Font.BOLD,14));
setForeground(Color.BLUE);
setBorder(BorderFactory.createEtchedBorder());
}

@Override
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,
booleanisSelected,booleanhasFocus,introw,intcolumn){
setText(value.toString());
returnthis;
}

Codeofademoprogram,JTableHeaderRendererSimple.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

packagenet.codejava.swing.jtable;

importjavax.swing.JFrame;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.SwingUtilities;

/**
*ASwingprogramdemonstrateshowtouseacustomrendererfor
*allcolumnheadersofaJTablecomponent.
*@authorwww.codejava.net
*
*/
publicclassJTableHeaderRendererSimpleextendsJFrame{

privateJTabletable;

publicJTableHeaderRendererSimple(){
super("JTableColumnHeaderCustomRendererBasic");

//constructsthetable
String[]columnNames=newString[]{"Title","Author","Publisher","PublishedDate","Pages","Rating"};
String[][]rowData=newString[][]{
{"EffectiveJava","JoshuaBloch","AddisionWesley","May08th2008","346","5"},
{"ThinkinginJava","BruceEckel","PrenticeHall","Feb26th2006","1150","4"},
{"HeadFirstJava","KathySierra&BertBates","O'ReillyMedia","Feb09th2005","688","4.5"},
};

table=newJTable(rowData,columnNames);

30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

table.getTableHeader().setDefaultRenderer(newSimpleHeaderRenderer());

add(newJScrollPane(table));

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(640,150);
setLocationRelativeTo(null);
}

publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(newRunnable(){
@Override
publicvoidrun(){
newJTableHeaderRendererSimple().setVisible(true);
}
});
}

Outputwhenrunningthedemoprogram:

2.Multicustomrenderersfordifferentcolumnheaders
Thisexampleshowshowtocreateandapplydifferentrenderersfordifferentcolumnheaders,forthesetableheaders:

WearegoingtocreateadefaultrenderforallheadersandthreedifferentrenderersforthethreecolumnsWon,Drawn,andLost.
Codeofthedefaultrendererclass,DefaultHeaderRenderer.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

packagenet.codejava.swing.jtable;

importjava.awt.Color;
importjava.awt.Component;
importjava.awt.Font;

importjavax.swing.BorderFactory;
importjavax.swing.JLabel;
importjavax.swing.JTable;
importjavax.swing.table.TableCellRenderer;

/**
*AsimplerendererclassforJTablecomponent.
*@authorwww.codejava.net
*
*/
publicclassDefaultHeaderRendererextendsJLabelimplementsTableCellRenderer{

publicDefaultHeaderRenderer(){
setFont(newFont("Consolas",Font.BOLD,14));
setOpaque(true);
setForeground(Color.WHITE);
setBackground(Color.BLACK);
setBorder(BorderFactory.createEtchedBorder());
}

@Override
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,
booleanisSelected,booleanhasFocus,introw,intcolumn){
setText(value.toString());
returnthis;
}

CodeoftherendererclassfortheWoncolumnheader,WonHeaderRenderer.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

packagenet.codejava.swing.jtable;

importjava.awt.Color;
importjava.awt.Component;
importjava.awt.Font;

importjavax.swing.BorderFactory;
importjavax.swing.JLabel;
importjavax.swing.JTable;
importjavax.swing.table.TableCellRenderer;

/**
*AsimplerendererclassforJTablecomponent.
*@authorwww.codejava.net
*
*/
publicclassWonHeaderRendererextendsJLabelimplementsTableCellRenderer{

publicWonHeaderRenderer(){
setFont(newFont("Consolas",Font.BOLD,14));
setOpaque(true);
setForeground(Color.WHITE);
setBackground(Color.BLUE);
setBorder(BorderFactory.createEtchedBorder());
}

@Override
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,
booleanisSelected,booleanhasFocus,introw,intcolumn){
setText(value.toString());
returnthis;
}

CodeoftherendererclassfortheDrawncolumnheader,DrawnHeaderRenderer.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

packagenet.codejava.swing.jtable;

importjava.awt.Color;
importjava.awt.Component;
importjava.awt.Font;

importjavax.swing.BorderFactory;
importjavax.swing.JLabel;
importjavax.swing.JTable;
importjavax.swing.table.TableCellRenderer;

/**
*AsimplerendererclassforJTablecomponent.
*@authorwww.codejava.net
*
*/
publicclassDrawnHeaderRendererextendsJLabelimplementsTableCellRenderer{

publicDrawnHeaderRenderer(){
setFont(newFont("Consolas",Font.BOLD,14));
setOpaque(true);
setForeground(Color.BLACK);
setBackground(Color.YELLOW);
setBorder(BorderFactory.createEtchedBorder());
}

@Override
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,
booleanisSelected,booleanhasFocus,introw,intcolumn){
setText(value.toString());
returnthis;
}

RelatedCourse:JavaSwing(GUI)Programming:FromBeginnertoExpert

CodeoftherendererclassfortheLostcolumnheader,LostHeaderRenderer.java:
1
2
3
4

packagenet.codejava.swing.jtable;

importjava.awt.Color;
importjava.awt.Component;

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

importjava.awt.Font;

importjavax.swing.BorderFactory;
importjavax.swing.JLabel;
importjavax.swing.JTable;
importjavax.swing.table.TableCellRenderer;

/**
*AsimplerendererclassforJTablecomponent.
*@authorwww.codejava.net
*
*/
publicclassLostHeaderRendererextendsJLabelimplementsTableCellRenderer{

publicLostHeaderRenderer(){
setFont(newFont("Consolas",Font.BOLD,14));
setOpaque(true);
setForeground(Color.WHITE);
setBackground(Color.GRAY);
setBorder(BorderFactory.createEtchedBorder());
}

@Override
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,
booleanisSelected,booleanhasFocus,introw,intcolumn){
setText(value.toString());
returnthis;
}

Codeofademoprogram,JTableHeaderMultiRenderers.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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

packagenet.codejava.swing.jtable;

importjavax.swing.JFrame;
importjavax.swing.JScrollPane;
importjavax.swing.JTable;
importjavax.swing.SwingUtilities;

/**
*ASwingprogramdemonstrateshowtousemulticustomrenderersfor
*columnheadersofaJTablecomponent.
*@authorwww.codejava.net
*
*/
publicclassJTableHeaderMultiRenderersextendsJFrame{

privateJTabletable;

publicJTableHeaderMultiRenderers(){

super("JTableColumnHeaderMultiCustomRenderers");

//constructsthetable
String[]columnNames=newString[]{"Position","Team","Won","Drawn","Lost","Points"};
String[][]rowData=newString[][]{
{"1","ManchesterUnited","28","5","5","89"},
{"2","ManchesterCity","23","9","6","78"},
{"3","Chelsea","22","9","7","75"},
{"4","Arsenal","21","10","7","73"},
};

table=newJTable(rowData,columnNames);

table.getTableHeader().setDefaultRenderer(newDefaultHeaderRenderer());
table.getColumnModel().getColumn(2).setHeaderRenderer(newWonHeaderRenderer());
table.getColumnModel().getColumn(3).setHeaderRenderer(newDrawnHeaderRenderer());
table.getColumnModel().getColumn(4).setHeaderRenderer(newLostHeaderRenderer());

add(newJScrollPane(table));

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(640,150);
setLocationRelativeTo(null);
}

publicstaticvoidmain(String[]args){
SwingUtilities.invokeLater(newRunnable(){
@Override
publicvoidrun(){
newJTableHeaderMultiRenderers().setVisible(true);
}
});
}

53

Outputwhenrunningthedemoprogram:

3.Keepingsorticons
Oneproblemwiththecustomrendererforcolumnheaderisthatthesorticons(e.g.ascendinganddescendingicons)arelost,eventhesortingfunctionality
isstillworkingfine.Toovercomethisproblem,createarendererclassasfollows:
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

packagenet.codejava.swing.jtable;

importjava.awt.Color;
importjava.awt.Component;
importjava.awt.Font;

importjavax.swing.BorderFactory;
importjavax.swing.JLabel;
importjavax.swing.JTable;
importjavax.swing.table.TableCellRenderer;

/**
*AsimplerendererclassforJTablecomponent,butkeepthesorticons.
*@authorwww.codejava.net
*
*/
publicclassKeepSortIconHeaderRendererimplementsTableCellRenderer{

privateTableCellRendererdefaultRenderer;

publicKeepSortIconHeaderRenderer(TableCellRendererdefaultRenderer){
this.defaultRenderer=defaultRenderer;
}

@Override
publicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,
booleanisSelected,booleanhasFocus,introw,intcolumn){
Componentcomp=defaultRenderer.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);

if(compinstanceofJLabel){
JLabellabel=(JLabel)comp;
label.setFont(newFont("Consolas",Font.BOLD,14));
label.setForeground(Color.BLUE);
label.setBorder(BorderFactory.createEtchedBorder());
}

returncomp;
}

Thetrickhereistoupdatethedefaultrenderer(whichisusuallyaJLabelinstance)insteadofreturningacompletelynewJLabelcomponent.Codetouse
thisrendererisasfollows:
Forallcolumnheaders:
1
2

Output:

JTableHeaderheader=table.getTableHeader();
header.setDefaultRenderer(newKeepSortIconHeaderRenderer(header.getDefaultRenderer()));

Foraspecificcolumnheader:
1
2

TableColumncolumn=table.getColumnModel().getColumn(2);
column.setHeaderRenderer(newKeepSortIconHeaderRenderer(table.getTableHeader().getDefaultRenderer()));

Output:

YoucandownloaddemoprogramsintheAttachmentssection.

LearnAdvancedSwingtechniquesinCoreJava,VolumeIIAdvancedFeatures(9thEdition)

DoyouwanttobeexpertinJavaprogramming?Ifyoudo,whynotjoinourmailinglisttogetadvicesfromtheprofessionalseveryday?Justclickhere:
http://newsletter.codejava.netIt'sFREE,QuickandAwesome!
Attachments:
DefaultHeaderRenderer.java

[Customrenderer]

0.8kB

DrawnHeaderRenderer.java

[Customrenderer]

0.8kB

DrawnHeaderRendererKeepSortIcon.java

[Customrenderer(keepsorticons)]

1kB

JTableHeaderMultiRenderers.java

[Demoprogram(multirenderers)]

1kB

JTableHeaderMultiRenderersKeepSortIcons.java [Demoprogram(multirenderers+keepsorticons)]

1kB

JTableHeaderRendererKeepSortIcon.java

[Demoprogram(singlerenderer+keepsorticons)]

1kB

JTableHeaderRendererSimple.java

[Demoprogram(singlerenderer)]

1kB

KeepSortIconHeaderRenderer.java

[Customrenderer(keepsorticons)]

LostHeaderRenderer.java

[Customrenderer]

0.8kB

SimpleHeaderRenderer.java

[Customrenderer]

0.7kB

WonHeaderRenderer.java

[Customrenderer]

0.8kB

1kB

You might also like