java - Refresh/Update highlighter in JTable when changing search values -
how can refresh highlighter in jtable after changing search value in jtextfield? works fine jtextarea under jtextfield, jtable won't refresh highlighter. suggestions??
this code:
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; import javax.swing.text.*; import javax.swing.text.defaulthighlighter.defaulthighlightpainter; public class beispieltabelle { jtextfield field; jtextarea textfeld = new jtextarea("hello world!"); string input="stefan"; //titel der tabelle string[] title = {"eins", "zwei", "drei"}; //tabellendaten object[][] playerdata = { {"34", "stefan", "mein name ist stefan"}, {"32", "dirk", "ich bin der dirk"}, {"99", "patrick", "ich heisse patrick"}, {"100", "anna", "ich bin die anna"},}; //tablemodel defaulttablemodel model = new defaulttablemodel(playerdata,title); //tabelle erstellen jtable texttable = new jtable(model); public jpanel erstelletabelle() { jpanel totalgui = new jpanel(); //cellrenderer searchrenderer cellrenderer = new searchrenderer(); //spaltenbreiten festlegen texttable.setdefaultrenderer(string.class, cellrenderer); texttable.getcolumnmodel().getcolumn(0).setcellrenderer(cellrenderer); texttable.getcolumnmodel().getcolumn(1).setcellrenderer(cellrenderer); texttable.getcolumnmodel().getcolumn(2).setcellrenderer(cellrenderer); texttable.setautoresizemode(jtable.auto_resize_off); // autoresizing abschalten, sonst sind alle spalten gleich breit: texttable.getcolumnmodel().getcolumn(0).setpreferredwidth(60); texttable.getcolumnmodel().getcolumn(1).setpreferredwidth(60); texttable.getcolumnmodel().getcolumn(2).setpreferredwidth(180); //das ganze scrollbar machen jscrollpane scrollpane = new jscrollpane(texttable); //textfeld erstellen field = new jtextfield(); field.addactionlistener(new actionlistener () { @override public void actionperformed(actionevent e) { input = field.gettext(); system.out.println(input); //updaterowheights(); highlighttext(); } }); totalgui.add(scrollpane); totalgui.add(field); totalgui.add(textfeld); return totalgui; } void highlighttext() { defaulthighlightpainter yellowpainter = new defaulthighlighter.defaulthighlightpainter(color.yellow); highlighter highlighter = textfeld.gethighlighter(); highlighter.removeallhighlights(); string text = textfeld.gettext(); string pattern = input; int index = text.indexof(pattern); while ( index >= 0 ) { int len = pattern.length(); try { highlighter.addhighlight(index, index+len, yellowpainter); } catch (badlocationexception e) { e.printstacktrace(); } index = text.indexof(pattern, index+len); } } private static void createandshowgui() { //create main frame jframe mainframe = new jframe(""); beispieltabelle test = new beispieltabelle(); jpanel totalgui = new jpanel(); totalgui = test.erstelletabelle(); totalgui.setlayout(new boxlayout(totalgui, boxlayout.y_axis)); //visible mode mainframe.setdefaultcloseoperation(jframe.exit_on_close); mainframe.add(totalgui); //integrate main panel main frame mainframe.pack(); mainframe.setvisible(true); } public static void main (string[] args) { createandshowgui(); }//main }//gui_main
and searchrenderer
import javax.swing.*; import javax.swing.table.*; import javax.swing.text.badlocationexception; import java.awt.*; public class searchrenderer extends jtextarea implements tablecellrenderer { /** * */ private static final long serialversionuid = 1l; public searchrenderer() {}//constructor beispieltabelle tabelle = new beispieltabelle(); string textforsearch=tabelle.input; @override public component gettablecellrenderercomponent (jtable table, object value, boolean isselected, boolean hasfocus, int row, int column ) { this.settext((string) value); if(value != null) { string string = value.tostring(); if(string.contains(textforsearch)){ int indexof = string.indexof(textforsearch); while(indexof >=0) { try { this.gethighlighter().addhighlight(indexof,indexof+textforsearch.length(),new javax.swing.text.defaulthighlighter.defaulthighlightpainter(color.green)); } catch (badlocationexception e) { e.printstacktrace(); } indexof = string.indexof(textforsearch, indexof+textforsearch.length()); } } } else { this.settext(""); this.gethighlighter().removeallhighlights(); } return this; } }
maybe can use jtable#repaint()
import java.awt.*; import java.util.objects; import java.util.regex.*; import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*; import javax.swing.text.*; public final class searchrenderertest { private final jtextfield field = new jtextfield("stefan"); private final searchrenderer renderer = new searchrenderer(); //titel der tabelle private final string[] title = {"eins", "zwei", "drei"}; //tabellendaten private final object[][] playerdata = { {"34", "stefan", "mein name ist stefan"}, {"32", "dirk", "ich bin der dirk"}, {"99", "patrick", "ich heisse patrick"}, {"100", "anna", "ich bin die anna"}, }; private final tablemodel model = new defaulttablemodel(playerdata, title); private final jtable table = new jtable(model); public jcomponent makeui() { table.setdefaultrenderer(object.class, renderer); field.getdocument().adddocumentlistener(new documentlistener() { @override public void insertupdate(documentevent e) { firedocumentchangeevent(); } @override public void removeupdate(documentevent e) { firedocumentchangeevent(); } @override public void changedupdate(documentevent e) { /* not needed */ } }); firedocumentchangeevent(); jpanel sp = new jpanel(new borderlayout(5, 5)); sp.add(new jlabel("regex pattern:"), borderlayout.west); sp.add(field); sp.add(box.createverticalstrut(2), borderlayout.south); sp.setborder(borderfactory.createtitledborder("search")); jpanel p = new jpanel(new borderlayout(5, 5)); p.setborder(borderfactory.createemptyborder(5, 5, 5, 5)); p.add(sp, borderlayout.north); p.add(new jscrollpane(table)); return p; } private void firedocumentchangeevent() { string pattern = field.gettext().trim(); renderer.setpattern(pattern); table.repaint(); } public static void main(string[] args) { eventqueue.invokelater(new runnable() { @override public void run() { createandshowgui(); } }); } public static void createandshowgui() { jframe f = new jframe(); f.setdefaultcloseoperation(windowconstants.exit_on_close); f.getcontentpane().add(new searchrenderertest().makeui()); f.pack(); f.setlocationrelativeto(null); f.setvisible(true); } } class searchrenderer implements tablecellrenderer { private static final color background_selection_color = new color(220, 240, 255); private final transient highlighter.highlightpainter highlightpainter = new defaulthighlighter.defaulthighlightpainter(color.yellow); private final jtextfield field = new jtextfield(); private string pattern = ""; private string prev; public boolean setpattern(string str) { if (str == null || str.equals(pattern)) { return false; } else { prev = pattern; pattern = str; return true; } } public searchrenderer() { super(); field.setopaque(true); field.setborder(borderfactory.createemptyborder()); field.setforeground(color.black); field.setbackground(color.white); field.seteditable(false); } @override public component gettablecellrenderercomponent( jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { string txt = objects.tostring(value, ""); highlighter highlighter = field.gethighlighter(); highlighter.removeallhighlights(); field.settext(txt); field.setbackground(isselected ? background_selection_color : color.white); if (pattern != null && !pattern.isempty() && !pattern.equals(prev)) { matcher matcher = pattern.compile(pattern).matcher(txt); if (matcher.find()) { int start = matcher.start(); int end = matcher.end(); try { highlighter.addhighlight(start, end, highlightpainter); } catch (badlocationexception e) { e.printstacktrace(); } } } return field; } }
Comments
Post a Comment