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()

enter image description here

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

Popular posts from this blog

c# - How to get the current UAC mode -

postgresql - Lazarus + Postgres: incomplete startup packet -

angularjs - ng-repeat duplicating items after page reload -