java - Linking renderer that displays a jComboBox to a cell in the jTable -
the problem is, when user clicks on cell style of line, , chooses 1 of 4 options , after clicks on other cell line style, after that, other cell displays line style, choosen in previous selected cell. how to, make line style unique every cell (different line styles in different cells) in "line style" column? cells in "line colour" column works fine , implemented similarly.
here sscce:
main class:
import javax.swing.jframe; public class panelmain { public static void main(string[] args) { string[] tab = { "abc", "cde", "efg" }; panel panel = new panel(tab); jframe frame = new jframe(); frame.add(panel); frame.setvisible(true); } }
panel:
import java.awt.basicstroke; import java.awt.color; import java.awt.dimension; import javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtable; import javax.swing.table.abstracttablemodel; @suppresswarnings("serial") public class panel extends jpanel { private jscrollpane scrollpane_properties; private jtable table_properties; private object[][] datatotable; public panel(string[] tab) { setpreferredsize(new dimension(293, 416)); setlayout(null); scrollpane_properties = new jscrollpane(); scrollpane_properties.setbounds(10, 11, 273, 393); add(scrollpane_properties); datatotable = new object[tab.length][3]; (int = 0; < tab.length; i++) { datatotable[i][0] = tab[i]; datatotable[i][1] = linestyle.values()[0].getstroke(); datatotable[i][2] = colorgenerator.generatecolor(); } table_properties = new jtable(new mytablemodel()); table_properties.setautocreaterowsorter(true); table_properties.setdefaultrenderer(color.class, new tablecellcolorrenderer(true)); table_properties.setdefaulteditor(color.class, new tablecellcoloreditor()); table_properties.setdefaultrenderer(basicstroke.class, new tablecelllinerenderer(true)); table_properties.setdefaulteditor(basicstroke.class, new tablecelllineeditor()); scrollpane_properties.setviewportview(table_properties); } class mytablemodel extends abstracttablemodel { private string[] columnnames = { "name", "linestyle", "linecolor" }; private object[][] data = datatotable; public int getcolumncount() { return columnnames.length; } public int getrowcount() { return data.length; } public string getcolumnname(int col) { return columnnames[col]; } public object getvalueat(int row, int col) { return data[row][col]; } public class getcolumnclass(int c) { return getvalueat(0, c).getclass(); } public boolean iscelleditable(int row, int col) { if (col < 1) { return false; } else { return true; } } public void setvalueat(object value, int row, int col) { data[row][col] = value; firetablecellupdated(row, col); } } }
tablecellcoloreditor:
import javax.swing.abstractcelleditor; import javax.swing.table.tablecelleditor; import javax.swing.jbutton; import javax.swing.jcolorchooser; import javax.swing.jdialog; import javax.swing.jtable; import java.awt.color; import java.awt.component; import java.awt.event.actionevent; import java.awt.event.actionlistener; public class tablecellcoloreditor extends abstractcelleditor implements tablecelleditor, actionlistener { color currentcolor; jbutton button; jcolorchooser colorchooser; jdialog dialog; protected static final string edit = "edit"; public tablecellcoloreditor() { button = new jbutton(); button.setactioncommand(edit); button.addactionlistener(this); button.setborderpainted(false); colorchooser = new jcolorchooser(); dialog = jcolorchooser.createdialog(button, "pick color", true, colorchooser, this, null); } public void actionperformed(actionevent e) { if (edit.equals(e.getactioncommand())) { button.setbackground(currentcolor); colorchooser.setcolor(currentcolor); dialog.setvisible(true); fireeditingstopped(); } else { currentcolor = colorchooser.getcolor(); } } public object getcelleditorvalue() { return currentcolor; } public component gettablecelleditorcomponent(jtable table, object value, boolean isselected, int row, int column) { currentcolor = (color) value; return button; } }
tablecellcolorrenderer:
import javax.swing.borderfactory; import javax.swing.jlabel; import javax.swing.jtable; import javax.swing.border.border; import javax.swing.table.tablecellrenderer; import java.awt.color; import java.awt.component; public class tablecellcolorrenderer extends jlabel implements tablecellrenderer { border unselectedborder = null; border selectedborder = null; boolean isbordered = true; public tablecellcolorrenderer(boolean isbordered) { this.isbordered = isbordered; setopaque(true); } public component gettablecellrenderercomponent(jtable table, object color, boolean isselected, boolean hasfocus, int row, int column) { color newcolor = (color) color; setbackground(newcolor); if (isbordered) { if (isselected) { if (selectedborder == null) { selectedborder = borderfactory.creatematteborder(2, 5, 2, 5, table.getselectionbackground()); } setborder(selectedborder); } else { if (unselectedborder == null) { unselectedborder = borderfactory.creatematteborder(2, 5, 2, 5, table.getbackground()); } setborder(unselectedborder); } } settooltiptext("rgb value: " + newcolor.getred() + ", " + newcolor.getgreen() + ", " + newcolor.getblue()); return this; } }
tablecelllineeditor:
import java.awt.basicstroke; import java.awt.component; import javax.swing.abstractcelleditor; import javax.swing.jcombobox; import javax.swing.jtable; import javax.swing.table.tablecelleditor; public class tablecelllineeditor extends abstractcelleditor implements tablecelleditor { jcombobox combobox; public tablecelllineeditor() { combobox = new jcombobox(linestyle.values()); combobox.setrenderer(new listcelllinerenderer()); } @override public object getcelleditorvalue() { return (basicstroke) linestyle.values()[combobox.getselectedindex()].getstroke(); } @override public component gettablecelleditorcomponent(jtable table, object value, boolean isselected, int row, int column) { basicstroke stroke = (basicstroke) linestyle.values()[combobox.getselectedindex()].getstroke(); return combobox; } }
tablecelllinerenderer:
import java.awt.basicstroke; import java.awt.color; import java.awt.component; import java.awt.graphics; import java.awt.graphics2d; import javax.swing.jpanel; import javax.swing.jtable; import javax.swing.table.tablecellrenderer; public class tablecelllinerenderer extends jpanel implements tablecellrenderer { private basicstroke value; public tablecelllinerenderer(boolean isbordered) { setopaque(true); } @override protected void paintcomponent(graphics g) { super.paintcomponent(g); graphics2d g2d = (graphics2d) g; if (value != null) { g2d.setstroke(value); g.drawline(0, getheight() / 2, getwidth(), getheight() / 2); } } private void setlinetype(basicstroke value) { this.value = value; } @override public component gettablecellrenderercomponent(jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { setbackground(color.white); if (value instanceof basicstroke) { setlinetype((basicstroke) value); } else { setlinetype(null); } return this; } }
listcelllinerenderer:
import java.awt.component; @suppresswarnings({ "rawtypes", "serial" }) public class listcelllinerenderer extends jpanel implements listcellrenderer { public listcelllinerenderer() { } private linestyle value; @override public component getlistcellrenderercomponent(jlist list, object value, int index, boolean isselected, boolean cellhasfocus) { if (value instanceof linestyle) { setlinetype((linestyle) value); } else { setlinetype(null); } return this; } @override protected void paintcomponent(graphics g) { super.paintcomponent(g); graphics2d g2d = (graphics2d) g; if (value != null) { g2d.setstroke(value.getstroke()); g.drawline(0, getheight() / 2, getwidth(), getheight() / 2); } } private void setlinetype(linestyle value) { this.value = value; } @override public dimension getpreferredsize() { return new dimension(50, 20); } }
enum linestyle:
import java.awt.basicstroke; import java.awt.stroke; public enum linestyle { 1 { @override public stroke getstroke() { return new basicstroke(1.0f, basicstroke.cap_butt, basicstroke.join_miter, 4.0f); } }, 2 { @override public stroke getstroke() { return new basicstroke(1.0f, basicstroke.cap_butt, basicstroke.join_miter, 4.0f, pattern[1], 0.0f); } }, 3 { @override public stroke getstroke() { return new basicstroke(1.0f, basicstroke.cap_butt, basicstroke.join_miter, 4.0f, pattern[2], 0.0f); } }, 4 { @override public stroke getstroke() { return new basicstroke(1.0f, basicstroke.cap_round, basicstroke.join_miter, 4.0f, pattern[3], 0.0f); } }; private static float[][] pattern = { { 10.0f }, { 10.0f, 10.0f }, { 10.0f, 10.0f, 2.0f, 10.0f }, { 1.0f, 20.0f } }; public abstract stroke getstroke(); }
colorgenerator:
import java.awt.color; import java.util.random; public class colorgenerator { public static color generatecolor() { random rand = new random(); float r = rand.nextfloat(); float g = rand.nextfloat(); float b = rand.nextfloat(); color randomcolor = new color(r, g, b); return randomcolor; } }
ok, i've solved problem. replacement "unique" combobox every cell. works, works fine, after modification in tablecelllineeditor class:
import java.awt.basicstroke; import java.awt.component; import java.awt.event.actionevent; import java.awt.event.actionlistener; import javax.swing.abstractcelleditor; import javax.swing.jcombobox; import javax.swing.jtable; import javax.swing.table.tablecelleditor; public class tablecelllineeditor extends abstractcelleditor implements tablecelleditor, actionlistener { jcombobox combobox; private basicstroke val; protected static final string edit = "edit"; public tablecelllineeditor() { combobox = new jcombobox(linestyle.values()); combobox.setrenderer(new listcelllinerenderer()); combobox.setactioncommand(edit); combobox.addactionlistener(this); } @override public object getcelleditorvalue() { return (basicstroke) ((linestyle) combobox.getselecteditem()).getstroke(); } @override public component gettablecelleditorcomponent(jtable table, object value, boolean isselected, int row, int column) { val = (basicstroke) value; (int = 0; < linestyle.values().length; i++) { if (val.equals(((basicstroke) (linestyle.values()[i]).getstroke()))) { combobox.setselecteditem(linestyle.values()[i]); } } return combobox; } @override public void actionperformed(actionevent e) { if (edit.equals(e.getactioncommand())) { val = (basicstroke) ((linestyle) combobox.getselecteditem()).getstroke(); fireeditingstopped(); } else { val = (basicstroke) combobox.getselecteditem(); } } }
thank all, suggestions, , answers :)
Comments
Post a Comment