java - How to implement auto complete functionality in a cell in JTable? -
my jtable has cell editor implemented instance of defaultcelleditor(jcombobox) class. i've tried couple of different things (adding auto-completion support swing comboboxes ) still doesn't work.
1:
// jcombobox combo = new jcombobox(new object[] { "ester", "jordi", "jordina", "jorge", "sergi" }); autocompletedecorator.decorate(combo); defaultcelleditor celleditor = new defaultcelleditor(combo); tablecolumn column = mytable.getcolumnmodel().getcolumn(2); column.setcelleditor(celleditor); // 2:
// object[] elements = new object[] { "ester", "jordi", "jordina", "jorge", "sergi" }; jcombobox c = new jcombobox(elements); c.seteditable(true); autocompletesupport support = autocompletesupport.install(c, glazedlists.eventlistof(elements)); support.setselectstextonfocusgain(false); support.sethidespopuponfocuslost(false); support.setstrict(false); comboboxcelleditor combo = new comboboxcelleditor(c); tablecolumn column = mytable.getcolumnmodel().getcolumn(2); combotablecellrenderer renderer = new combotablecellrenderer(); column.setcellrenderer(renderer); column.setcelleditor(combo); // 3:
// object[] elements = new object[] { "ester", "jordi", "jordina", "jorge", "sergi" }; jcombobox combobox = new jcombobox(elements); combobox.seteditable(true); autocompletion ac = new autocompletion(combobox); ac.setstrict(false); defaultcelleditor celleditor = new defaultcelleditor(combobox); tablecolumn column = mytable.getcolumnmodel().getcolumn(2); column.setcelleditor(celleditor); // the problem facing user starts typing in combo box, comes out of editing mode, , preventing entering value.
no issue favorite autocomplete jcombobox / jtextfield, still there second choice use autocomplete jtextfield instead of autocomplete jcombobox,


added code oracle jtable tutorial
import javax.swing.defaultcelleditor; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.table.abstracttablemodel; import javax.swing.table.defaulttablecellrenderer; import javax.swing.table.tablecellrenderer; import javax.swing.table.tablecolumn; import java.awt.component; import java.awt.dimension; import java.awt.gridlayout; import java.util.arraylist; /** * tablerenderdemo tabledemo, except * explicitly initializes column sizes , uses combo box * editor sport column. */ public class tablerenderdemo extends jpanel { private static final long serialversionuid = 1l; private boolean debug = false; public tablerenderdemo() { super(new gridlayout(1, 0)); jtable table = new jtable(new mytablemodel()); table.setpreferredscrollableviewportsize(new dimension(500, 70)); table.setfillsviewportheight(true); //create scroll pane , add table it. jscrollpane scrollpane = new jscrollpane(table); //set column sizes. initcolumnsizes(table); //fiddle sport column's cell editors/renderers. setupsportcolumn(table, table.getcolumnmodel().getcolumn(2)); //add scroll pane panel. add(scrollpane); } /* * method picks column sizes. * if column heads wider column's cells' * contents, can use column.sizewidthtofit(). */ private void initcolumnsizes(jtable table) { mytablemodel model = (mytablemodel) table.getmodel(); tablecolumn column = null; component comp = null; int headerwidth = 0; int cellwidth = 0; object[] longvalues = model.longvalues; tablecellrenderer headerrenderer = table.gettableheader().getdefaultrenderer(); (int = 0; < 5; i++) { column = table.getcolumnmodel().getcolumn(i); comp = headerrenderer.gettablecellrenderercomponent(null, column.getheadervalue(), false, false, 0, 0); headerwidth = comp.getpreferredsize().width; comp = table.getdefaultrenderer(model.getcolumnclass(i)).gettablecellrenderercomponent(table, longvalues[i], false, false, 0, i); cellwidth = comp.getpreferredsize().width; if (debug) { system.out.println("initializing width of column " + + ". " + "headerwidth = " + headerwidth + "; cellwidth = " + cellwidth); } column.setpreferredwidth(math.max(headerwidth, cellwidth)); } } public void setupsportcolumn(jtable table, tablecolumn sportcolumn) { //set editor sport cells. arraylist<string> listsomestring = new arraylist<string>(); listsomestring.add("snowboarding"); listsomestring.add("rowing"); listsomestring.add("knitting"); listsomestring.add("speed reading"); listsomestring.add("pool"); listsomestring.add("none of above"); java2sautocombobox combobox = new java2sautocombobox(listsomestring); combobox.setdatalist(listsomestring); combobox.setmaximumrowcount(3); sportcolumn.setcelleditor(new defaultcelleditor(combobox)); //set tool tips sport cells. defaulttablecellrenderer renderer = new defaulttablecellrenderer(); renderer.settooltiptext("click combo box"); sportcolumn.setcellrenderer(renderer); } class mytablemodel extends abstracttablemodel { private static final long serialversionuid = 1l; private string[] columnnames = {"first name", "last name", "sport", "# of years", "vegetarian"}; private object[][] data = {{"kathy", "smith", "snowboarding", new integer(5), false}, {"john", "doe", "rowing", new integer(3), true}, {"sue", "black", "knitting", new integer(2), false}, {"jane", "white", "speed reading", new integer(20), true}, {"joe", "brown", "pool", new integer(10), false}}; public final object[] longvalues = {"jane", "kathy", "none of above", new integer(20), boolean.true}; @override public int getcolumncount() { return columnnames.length; } @override public int getrowcount() { return data.length; } @override public string getcolumnname(int col) { return columnnames[col]; } @override public object getvalueat(int row, int col) { return data[row][col]; } /* * jtable uses method determine default renderer/ * editor each cell. if didn't implement method, * last column contain text ("true"/"false"), * rather check box. */ @override public class<?> getcolumnclass(int c) { return getvalueat(0, c).getclass(); } /* * don't need implement method unless table's * editable. */ @override public boolean iscelleditable(int row, int col) { //note data/cell address constant, //no matter cell appears onscreen. if (col < 2) { return false; } else { return true; } } /* * don't need implement method unless table's * data can change. */ @override public void setvalueat(object value, int row, int col) { if (debug) { system.out.println("setting value @ " + row + "," + col + " " + value + " (an instance of " + value.getclass() + ")"); } data[row][col] = value; firetablecellupdated(row, col); if (debug) { system.out.println("new value of data:"); printdebugdata(); } } private void printdebugdata() { int numrows = getrowcount(); int numcols = getcolumncount(); (int = 0; < numrows; i++) { system.out.print(" row " + + ":"); (int j = 0; j < numcols; j++) { system.out.print(" " + data[i][j]); } system.out.println(); } system.out.println("--------------------------"); } } /** * create gui , show it. thread safety, * method should invoked * event-dispatching thread. */ private static void createandshowgui() { //create , set window. jframe frame = new jframe("tablerenderdemo"); frame.setdefaultcloseoperation(jframe.exit_on_close); //create , set content pane. tablerenderdemo newcontentpane = new tablerenderdemo(); newcontentpane.setopaque(true); //content panes must opaque frame.setcontentpane(newcontentpane); //display window. frame.pack(); frame.setvisible(true); } public static void main(string[] args) { //schedule job event-dispatching thread: //creating , showing application's gui. javax.swing.swingutilities.invokelater(new runnable() { @override public void run() { createandshowgui(); } }); } }
Comments
Post a Comment