java - JTable data does not show until scrolled? -
i have jtable in scrollpane containinig data extended defaulttablemodel. when load data table shows columns. scrollbar shows data there not show it. scroll data shows up. tried sort of fire() events on model , .repaint(), .revalidate etc. on jtable cann´t working. apperantely cellrenderer not called. how can resolve this?
public void settestcasemodel(testcasetablemodel testcase_model, list<string> names) { this.testcasetablemodel = testcase_model; testcasetable.setmodel(this.testcasetablemodel); testcasetable.setrowheight(40); tablecolumn column = testcasetable.getcolumnmodel().getcolumn(0); column.setcellrenderer(new testcasecellrenderer(names, this, tgc)); testcasecelleditor editor = new testcasecelleditor(testcasetable,this); column.setcelleditor(editor); editor.addcelleditorlistener(tgc); this.testcasetablemodel.firetabledatachanged(); }
testcasetablemodel
package gui.table; import java.util.list; import java.util.vector; import javax.swing.table.defaulttablemodel; import org.jdom2.element; @suppresswarnings("serial") public class testcasetablemodel extends defaulttablemodel { string[] columnnames = { "testcase" }; vector<string[]> row_data = new vector<string[]>(); public testcasetablemodel(element testsuite) { row_data.clear(); list<element> testcase_list = testsuite.getchildren("testcase"); string[] data; (int = 0; < testcase_list.size(); i++) { data = new string[4]; data[0] = ""; data[1] = "failed"; data[2] = testcase_list.get(i).getattributevalue("id"); data[3] = "play"; row_data.add(data); } } @override public void setvalueat(object value, int row, int col) { // output gui null exception if (value == null) return; row_data.elementat(row)[col] = value.tostring(); firetablecellupdated(row, col); } @override public int getcolumncount() { return columnnames.length; } @override public int getrowcount() { return row_data == null ? 0 : row_data.size(); } @override public string getvalueat(int row, int col) { return row_data.elementat(row)[col]; } public string getcolumnname(int column) { return columnnames[column]; } public void clear(){ row_data.clear(); firetabledatachanged(); } }
thanks ideas.
you're extending defaulttablemodel. defaulttablemodel stores column names , data in own vectors. methods data in defaulttablemodel's vectors.
your subclass recreates vector store data. can't possibly work: base class methods don't know , care new vector.
either want own data structure store data , column names, , should extend abstracttablemodel
. or want use defaulttablemodel
, , can't have own data structure, since defaulttablemodel
defines own. except getcolumnclass()
, should not override method of defaulttablemodel
. if do, or if add methods, these methods should delegate methods defaulttablemodel
.
for example:
public class testcasetablemodel extends defaulttablemodel { // no vector here!! public testcasetablemodel(element testsuite) { // delegate parent constructor super(createdatavector(testsuite), createcolumnames()); } private static vector<vector<object>> createdatavector() { list<element> testcase_list = testsuite.getchildren("testcase"); vector<vector<object>> data; (int = 0; < testcase_list.size(); i++) { vector<object> row = new vector<object>(); row.add(""); row.add("failed"); row.add(testcase_list.get(i).getattributevalue("id")); row.add("play"); data.add(row); } return data; } private static vector<string> createcolumnnames() { vector<string> result = new vector<string>(); result.add("testcase"); result.add(""); result.add(""); result.add(""); return result; } /** * overridden ignore null values */ @override public void setvalueat(object value, int row, int col) { if (value == null) { return; } // delegate parent method super.setvalueat(value, row, col); } }
Comments
Post a Comment