Wednesday 15 June 2011

java - Very unusual cell highlighting in JXTable -



java - Very unusual cell highlighting in JXTable -

i have jxtable set paint selected cell in color. however, whenever selected cell in top row, appears though cells in table painted.

can help me understand why, , how resolve issue?

the smallest working illustration demonstrate issue below.

additional info: defaulttablecellrenderer re-applied every time paint() called, because placeholder customtablecellrenderer utilize in total program. interestingly, if remove defaulttablecellrenderer line, issue resolved. why this? surely, if renderer not specified, default used anyway??

import java.awt.color; import java.awt.component; import java.util.arraylist; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.event.listselectionevent; import javax.swing.event.listselectionlistener; import javax.swing.table.abstracttablemodel; import javax.swing.table.defaulttablecellrenderer; import org.jdesktop.swingx.jxtable; import org.jdesktop.swingx.decorator.colorhighlighter; import org.jdesktop.swingx.decorator.componentadapter; import org.jdesktop.swingx.decorator.highlightpredicate; public class mainclass { public static void main(string[] args) { jframe frame = new jframe(); customtablemodel tablemodel = new customtablemodel(); jxxtable table = new jxxtable(tablemodel); jscrollpane scrollpane = new jscrollpane(table); selectionlistener listener = new selectionlistener(table); table.getselectionmodel().addlistselectionlistener(listener); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.add(scrollpane); frame.setvisible(true); frame.pack(); } } class jxxtable extends jxtable { public jxxtable(customtablemodel model){ super(model); } public void paint(){ this.setdefaultrenderer(object.class, new defaulttablecellrenderer()); this.sethighlighters(); highlightpredicate predicate = new highlightpredicate() { public boolean ishighlighted(component renderer, componentadapter adapter) { homecoming adapter.hasfocus(); } }; this.addhighlighter(new colorhighlighter(predicate, null, null, new color(115,164,209), color.white)); } } class selectionlistener implements listselectionlistener { jxxtable table; public selectionlistener(jxxtable table) { this.table = table; } public void valuechanged(listselectionevent e) { table.paint(); } } class customtablemodel extends abstracttablemodel { arraylist<object[]> al; public customtablemodel() { al = new arraylist<object[]>(); object[] row = {1,2,3,"a","collection","of","random","strings",9,10}; al.add(row); object[] row2 = {11,12,13,"another","collection","of","random","strings",19,20}; al.add(row2); object[] row3 = {11,12,13,"another","collection","of","random","strings",19,20}; al.add(row3); object[] row4 = {11,12,13,"it","just","gets","more","random...",19,20}; al.add(row4); } public int getrowcount() { homecoming al.size(); } public int getcolumncount() { homecoming 10; } public object getvalueat(int rowindex, int columnindex) { homecoming al.get(rowindex)[columnindex]; } }

i "think" part of problem has adding highlighter every time selection changes.

instead, consider adding highlight when initialize table...

having said that, there's no need extend jxtable, you're not adding new functionality class. could, instead, create mill of kind configured table want

import java.awt.color; import java.awt.component; import java.awt.eventqueue; import java.util.arraylist; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.event.listselectionevent; import javax.swing.event.listselectionlistener; import javax.swing.table.abstracttablemodel; import javax.swing.table.defaulttablecellrenderer; import org.jdesktop.swingx.jxtable; import org.jdesktop.swingx.decorator.colorhighlighter; import org.jdesktop.swingx.decorator.highlightpredicate; public class mainclass { public static void main(string[] args) { new mainclass(); } public mainclass() { eventqueue.invokelater(new runnable() { @override public void run() { jframe frame = new jframe(); customtablemodel tablemodel = new customtablemodel(); jxtable table = new jxtable(tablemodel); table.setdefaultrenderer(object.class, new customtablecellrenderer()); highlightpredicate predicate = new highlightpredicate() { @override public boolean ishighlighted(component cmpnt, org.jdesktop.swingx.decorator.componentadapter ca) { system.out.println(ca.getcomponent()); homecoming ca.hasfocus(); } }; table.addhighlighter(new colorhighlighter(predicate, null, null, new color(115, 164, 209), color.white)); jscrollpane scrollpane = new jscrollpane(table); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.add(scrollpane); frame.setvisible(true); frame.pack(); } }); } class customtablecellrenderer extends defaulttablecellrenderer { public component gettablecellrenderercomponent(jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { homecoming (jlabel) super.gettablecellrenderercomponent(table, value, isselected, hasfocus, row, column); } } class customtablemodel extends abstracttablemodel { arraylist<object[]> al; public customtablemodel() { al = new arraylist<object[]>(); object[] row = {1, 2, 3, "a", "collection", "of", "random", "strings", 9, 10}; al.add(row); object[] row2 = {11, 12, 13, "another", "collection", "of", "random", "strings", 19, 20}; al.add(row2); object[] row3 = {11, 12, 13, "another", "collection", "of", "random", "strings", 19, 20}; al.add(row3); object[] row4 = {11, 12, 13, "it", "just", "gets", "more", "random...", 19, 20}; al.add(row4); } public int getrowcount() { homecoming al.size(); } public int getcolumncount() { homecoming 10; } public object getvalueat(int rowindex, int columnindex) { homecoming al.get(rowindex)[columnindex]; } } }

java swing jtable swingx jxtable

No comments:

Post a Comment