您的位置:程序门 -> java -> gui 设计



紧急求助有关使用jspinner作为table cell editor的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


紧急求助有关使用jspinner作为table cell editor的问题
发表于:2008-01-23 18:50:16 楼主
我想请问各位高手一个有关使用spinner做为单元编辑器的问题:
我有一个tabel,其中有一列是使用spinner作为单元编辑器。当我
使用tab健遍历各个单元格时,我希望当遍历到使用spinner的单元格时,
该单元被选中,并且可以在spinner的textfield中输入。

我现在的状态是,tab健可以遍历可编辑的单元格,当遍历到spinner单元格时,
使用上下键,可以改变单元的值,但是不可以在textfield上输入。看上去是因为
没有进入编辑状态,只有当鼠标单击textfield后才进入编辑状态。

请问各位知不知道如何让编辑器被选中?已经纠结在这个问题上两个星期了,希望各位
能指点迷津。在线等。
发表于:2008-01-23 18:51:401楼 得分:0


下面是renderer:
mport   java.awt.component;
import   javax.swing.jformattedtextfield;
import   javax.swing.jspinner;
import   javax.swing.jtable;
import   javax.swing.spinnernumbermodel;
import   javax.swing.table.tablecellrenderer;

public   class   spinnercellrenderer   implements   tablecellrenderer{
        private   jspinner   spinner;
        private   jformattedtextfield   ftf;
        public   spinnercellrenderer(int   value,   int   min)   {
                spinner   =   new   jspinner();
                spinner.setmodel(new   spinnernumbermodel(value,   min,   null,   1));
                ftf   =   new   jformattedtextfield(value);
        }
        public   component   gettablecellrenderercomponent(jtable   table,
                                                                                                      object   value,
                                                                                                      boolean   isselected,
                                                                                                      boolean   hasfocus,
                                                                                                      int   row,
                                                                                                      int   column)   {
                //   initializes   the   panel   to   be   returned   with   a   control   that   renders
                //   realization   data
                //integer   currentcolor   =   (integer)table.getvalueat(row,   column);
                spinner.getmodel().setvalue(value);
                //ftf.setvalue(value);
                if   (table   !=   null)   {
                        if(table.iscelleditable(row,   column))
                              ((jspinner.defaulteditor)(spinner.geteditor())).gettextfield().setbackground(table.getselectionbackground());
                              ((jspinner.defaulteditor)(spinner.geteditor())).gettextfield().setforeground(table.getselectionforeground());
                              //ftf.setbackground(table.getselectionbackground());
                              //ftf.setforeground(table.getselectionforeground());
                }   else   {
                        ((jspinner.defaulteditor)(spinner.geteditor())).gettextfield().setbackground(table.getbackground());
                        ((jspinner.defaulteditor)(spinner.geteditor())).gettextfield().setforeground(table.getforeground());
                        //ftf.setbackground(table.getbackground());
                        //ftf.setforeground(table.getforeground());
                }
               
                if   (hasfocus)   {
                        ((jspinner.defaulteditor)(spinner.geteditor())).gettextfield().setbackground(table.getselectionbackground());
                        ((jspinner.defaulteditor)(spinner.geteditor())).gettextfield().setforeground(table.getselectionforeground());
                        //ftf.setbackground(table.getselectionbackground());
                        //ftf.setforeground(table.getselectionforeground());
                        table.editcellat(row,   column);
                        table.geteditorcomponent().requestfocusinwindow();
                }   else   {
                        ((jspinner.defaulteditor)(spinner.geteditor())).gettextfield().setbackground(table.getbackground());
                        ((jspinner.defaulteditor)(spinner.geteditor())).gettextfield().setforeground(table.getforeground());
                        //((jspinner.defaulteditor)(spinner.geteditor())).gettextfield().seteditable(false);
                        //ftf.setbackground(table.getbackground());
                        //ftf.setforeground(table.getforeground());            
                }
                       
                //return   ftf;
                return   spinner;
        }
}
发表于:2008-01-23 18:52:362楼 得分:0
下面是我的editor的code:
import   java.awt.component;
import   java.awt.event.actionevent;
import   java.awt.event.focusevent;
import   java.awt.event.focuslistener;
import   java.awt.event.keyadapter;
import   java.awt.event.keyevent;
import   java.awt.event.mouseevent;
import   java.text.numberformat;
import   java.text.parseexception;
import   java.util.eventobject;
import   javax.swing.abstractaction;
import   javax.swing.action;
import   javax.swing.defaultcelleditor;
import   javax.swing.inputmap;
import   javax.swing.jcomponent;
import   javax.swing.jformattedtextfield;
import   javax.swing.jspinner;
import   javax.swing.jspinner.defaulteditor;
import   javax.swing.jtable;
import   javax.swing.jtextfield;
import   javax.swing.keystroke;
import   javax.swing.spinnernumbermodel;
import   javax.swing.event.changeevent;
import   javax.swing.event.changelistener;
import   javax.swing.event.documentevent;
import   javax.swing.event.documentlistener;
import   javax.swing.text.defaultformatterfactory;
import   javax.swing.text.numberformatter;

public   class   spinnercelleditor   extends   defaultcelleditor{

        protected   jtable   table;
        protected   spinnertablemodel   tablemodel;
        private   integer   minimum;
        private   integer   maximum;
        private   jformattedtextfield   ftf;
        private   numberformat   integerformat;
       
        public   spinnercelleditor(jtable   table)   {
                super(new   jtextfield());
                setclickcounttostart(0);
                this.table   =   table;
                tablemodel   =   (spinnertablemodel)table.getmodel();
                tableteyactiondefinition();
//                 keystroke   up   =   keystroke.getkeystroke(keyevent.vk_up,   0);
//                 im.put(up,   "none");
                keystroke   down   =   keystroke.getkeystroke(keyevent.vk_down,   0);
//                 im.put(down,   "none");
               
                spinnernumbermodel   tmodel   =   new   spinnernumbermodel(new   integer(0),   0,   null,1);
                editorcomponent   =   new   jspinner(tmodel);
                createjspinnerdelegate();
        }
       
          public   component   gettablecelleditorcomponent(jtable   table,
                                                                                                    object   value,
                                                                                                    boolean   isselected,  
                                                                                                    int   row,  
                                                                                                    int   column)   {
                        //categorytable.setfocustraversalkeysenabled(false);
                        minimum   =   0;
                        maximum   =   integer.max_value;
                        ((jspinner)editorcomponent).setmodel(new   spinnernumbermodel((integer)(value),   minimum,   maximum,   new   integer(1)));
                        settextfieldproperty();
                               
                        if   (value   !=   null   &&   value.equals(""))   {
                                ((jspinner)editorcomponent).getmodel().setvalue((integer)value);
                                ftf.setvalue(value);
                        }
                       
                        if   (isselected)   {
                                system.out.printf("\n%s",ftf.gettext());
                                //ftf.selectall();
                                //ftf.requestfocusinwindow();
                                //table.editcellat(row,   column);
                                //editorcomponent.requestfocusinwindow();
                                //table.geteditorcomponent().requestfocusinwindow();
                        }

                        return   editorcomponent;
                }
       
                private   void   settextfieldproperty()   {
                       
                ftf   =   ((jspinner.defaulteditor)((jspinner)editorcomponent).geteditor()).gettextfield();

                //set   up   the   editor   for   the   integer   cells.
                integerformat   =   numberformat.getintegerinstance();
                numberformatter   intformatter   =   new   numberformatter(integerformat);
                intformatter.setformat(integerformat);
                intformatter.setminimum(minimum);
                intformatter.setmaximum(maximum);

                ftf.setformatterfactory(
                                new   defaultformatterfactory(intformatter));
                //ftf.setvalue(minimum);
                ftf.sethorizontalalignment(jtextfield.trailing);
                ftf.setfocuslostbehavior(jformattedtextfield.commit_or_revert);
                ftf.addfocuslistener(new   focuslistener()   {

                        public   void   focusgained(focusevent   e)   {
                        }

                        public   void   focuslost(focusevent   e)   {
                                if   (ftf.gettext()   !=   null   &&   !ftf.gettext().equals(""))
                                        ((jspinner)editorcomponent).setvalue(integer.parseint(ftf.gettext()));
                        }
                });
                //ftf.setfocustraversalkeysenabled(false);

                //   only   allow   the   input   of   numbers
                ftf.addkeylistener(new   keyadapter()   {
                        public   void   keytyped(keyevent   e){    
                                char   c   =   e.getkeychar();    
                                if(character.isdigit(c)   ¦ ¦   c==keyevent.vk_back_space   ¦ ¦   c==keyevent.vk_delete)   {
                                        system.out.printf("\n%s\n",   ftf.gettext().tostring());
//                                         if   (ftf.gettext()   !=   null   &&   !ftf.gettext().equals(""))
//                                                 ((jspinner)editorcomponent).setvalue(integer.parseint(ftf.gettext()));
                                        return;    
                                }
                                e.consume();
                        }
                        public   void   keypressed(keyevent   e){    
                                if(e.iscontroldown())      
                                        e.consume();    
                        }    
                });

                //react   when   the   user   presses   enter   while   the   editor   is
                //active.     (tab   is   handled   as   specified   by
                //jformattedtextfield's   focuslostbehavior   property.)
                ftf.getinputmap().put(keystroke.getkeystroke(
                                                                                keyevent.vk_tab,   0),
                                                                                "check");
                ftf.getactionmap().put("check",   new   abstractaction()   {
                        public   void   actionperformed(actionevent   e)   {
                                if   (!ftf.iseditvalid())   {   //the   text   is   invalid.
//                                               ((jspinner)editorcomponent).getmodel().setvalue(((integer)ftf.gettext()));
                                                ftf.postactionevent();   //inform   the   editor
                                        }
                              else   {
                                        try   {                             //the   text   is   valid,
                                                ftf.commitedit();           //so   use   it.
                                                ftf.postactionevent();   //stop   editing
                                        }   catch   (java.text.parseexception   exc)   {   }
                                }
                        }
                });
        }
发表于:2008-01-23 18:53:263楼 得分:0
        //   handle   table   input/actionmap
        //   tab   to   editable   cell   only
        private   void   tableteyactiondefinition()   {
                inputmap   im   =   table.getinputmap(jtable.when_ancestor_of_focused_component);
                keystroke   tab   =   keystroke.getkeystroke(keyevent.vk_tab,   0);
                final   action   oldtabaction   =   table.getactionmap().get(im.get(tab));
                action   tabaction   =   new   abstractaction()   {
                        public   void   actionperformed(actionevent   e)   {
                                oldtabaction.actionperformed(   e   );
                                jtable   table   =   (jtable)e.getsource();
                                int   rowcount   =   table.getrowcount();
                                int   columncount   =   table.getcolumncount();
                                int   row   =   table.getselectedrow();
                                int   column   =   table.getselectedcolumn();
 
                                while   (!   table.iscelleditable(row,   column)   )   {
                                        column   +=   1;  
                                        if   (column   ==   columncount)   {
                                                column   =   0;
                                                row   +=1;
                                        }  
                                        if   (row   ==   rowcount)
                                                row   =   0;
 
                                        //     back   to   where   we   started,   get   out.
                                        if   (row   ==   table.getselectedrow()
                                        &&     column   ==   table.getselectedcolumn())   {
                                                break;
                                        }
                                }
 
                                table.changeselection(row,   column,   false,   false);
//                                 if   (table.editcellat(row,   column))
//                                         table.geteditorcomponent().requestfocusinwindow();
                        }
                };
                table.getactionmap().put(im.get(tab),   tabaction);
        }        
               
        public   object   getcelleditorvalue()   {
                return   ((jspinner)editorcomponent).getvalue();
        }
       
        /**
          *   creates   a   delatee   obj   for   the   combobox   which   will   handle   changes.
          */
        private   void   createjspinnerdelegate()   {
                ((jspinner)editorcomponent).putclientproperty("jspinner.istablecelleditor",   boolean.true);

                this.clickcounttostart   =   1;
                delegate   =   new   customeditordelegate(this)   {

                        public   void   setvalue(object   value)   {
                                ((jspinner)editorcomponent).setvalue((value   !=   null)   ?   value   :   0);
                        }

                        public   object   getcelleditorvalue()   {
                                return   ((jspinner)editorcomponent).getvalue();
                        }

                        public   boolean   shouldselectcell(eventobject   anevent)   {  
                                if   (anevent   instanceof   mouseevent)   {  
                                        mouseevent   e   =   (mouseevent)anevent;
                                        return   e.getid()   !=   mouseevent.mouse_dragged;
                                }

                                return   true;
                        }

                        public   void   statechanged(changeevent   e)   {
                                //celleditor.stopcellediting();
                                system.out.printf("\n%s,%d",ftf.gettext(),ftf.getvalue());
                                super.stopcellediting();
                        }
                };

                ((jspinner)editorcomponent).addchangelistener((customeditordelegate)delegate);
                ((jspinner)editorcomponent).setrequestfocusenabled(true);
        }

        /**
          *   custom   delegate   class.
          */
        protected   class   customeditordelegate   extends   editordelegate   implements   changelistener   {
                protected   spinnercelleditor   celleditor;

                public   customeditordelegate(final   spinnercelleditor   celleditor)   {
                        this.celleditor   =   celleditor;
                }

                //fixme:   check   that   this   works   well   for   the   combobox   as   well.
                public   void   statechanged(changeevent   e)   {
                        //only   applicable   for   the   spinner
                }
        }    
}


快速检索

最新资讯
热门点击