java - JTable column uneditable after adding JComboBox to a cell -
i have jtable component 2 columns, second column iwant add jcombobox 1 cell, following oracle documentation i've created own cell editor, , added jcombobox after of other cells column became uneditable. here example:
after adding jcombobox, not edit other cells
my code:
defaulttablemodel model = new defaulttablemodel(textostabela, stubcolumnnames); tabela.setmodel(model); tabela.setborder(new lineborder(color.black)); tabela.setgridcolor(color.black); tabela.setshowgrid(true); tabela.setpreferredsize(new dimension(290, 132)); tabela.setrowheight(22); tabela.getcolumnmodel().getcolumn(0).setpreferredwidth(160); tabela.setautoresizemode(jtable.auto_resize_all_columns); tablecolumn tm = tabela.getcolumnmodel().getcolumn(0); tm.setcellrenderer(new colorcolumnrenderer(color.lightgray)); tablecolumn combocol1 = tabela.getcolumnmodel().getcolumn(1); jcombobox combobox = new jcombobox(valorescombobox); combobox.setselectedindex(0); combocol1.setcelleditor(new comboboxeditor(1,3,combobox));
celleditor code:
public class comboboxeditor extends defaultcelleditor { private string[] values; private string selectedvalue; private int column = -1; private int row = -1; public comboboxeditor(jcombobox values) { super(values); // todo auto-generated constructor stub } public comboboxeditor(int column, int row, jcombobox values) { super(values); this.column = column; this.row = row; } @override public component gettablecelleditorcomponent(jtable table, object value, boolean isselected, int row, int column) { // todo auto-generated method stub component c = table.geteditorcomponent(); if(column == this.column && row == this.row) { return super.gettablecelleditorcomponent(table, value, isselected, row, column); } return null; } }
here example returns different combobo box row. if there no combo box row default editor used:
import java.awt.*; import java.util.list; import java.util.arraylist; import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; public class tablecomboboxbyrow extends jpanel { list<string[]> editordata = new arraylist<string[]>(3); public tablecomboboxbyrow() { setlayout( new borderlayout() ); // create editordata used each row editordata.add( new string[]{ "red", "blue", "green" } ); editordata.add( new string[]{ "circle", "square", "triangle" } ); editordata.add( new string[]{ "apple", "orange", "banana" } ); // create table default data object[][] data = { {"color", "red"}, {"shape", "square"}, {"fruit", "banana"}, {"plain", "text"} }; string[] columnnames = {"type","value"}; defaulttablemodel model = new defaulttablemodel(data, columnnames); jtable table = new jtable(model) { // determine editor used row public tablecelleditor getcelleditor(int row, int column) { int modelcolumn = convertcolumnindextomodel( column ); if (modelcolumn == 1 && row < 3) { jcombobox<string> combobox1 = new jcombobox<string>( editordata.get(row)); return new defaultcelleditor( combobox1 ); } else return super.getcelleditor(row, column); } }; jscrollpane scrollpane = new jscrollpane( table ); add( scrollpane ); // table.getcolumnmodel().getcolumn(1).setcellrenderer(new comboboxrenderer2() ); } private static void createandshowui() { jframe frame = new jframe("table combo box row"); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.add( new tablecomboboxbyrow() ); frame.setsize(200, 200); frame.setlocationbyplatform( true ); frame.setvisible( true ); } public static void main(string[] args) { eventqueue.invokelater(new runnable() { public void run() { createandshowui(); } }); } }
the key overriding getcelleditor(...)
method instead of creating custom renderer.
Comments
Post a Comment