<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    有才華的人,別忘記給滋潤你的那塊土壤施肥

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      28 隨筆 :: 5 文章 :: 147 評(píng)論 :: 0 Trackbacks
          在很多軟件中每個(gè)文本組件都有自定義的菜單,這個(gè)blogjava的編輯器就有這樣的菜單如:Cut , Copy,Paste,Delete,Select All,在Swing中若也想在JTextField,JTextArea,JEditorPane,JTextPane等等這些組件中都提供如此自定義菜單的功能,每個(gè)都寫繼承類?或者加鼠標(biāo)監(jiān)聽事件?但不管怎樣弄都會(huì)實(shí)現(xiàn)效果,只不過這樣動(dòng)靜很大,不好維護(hù),今天在網(wǎng)上看到一個(gè)很是方便的方法。

           大家都知道,Swing中所有的事件都是進(jìn)入java.awt.EventQueue這個(gè)隊(duì)列中等待,然后通過dispatchEvent方法進(jìn)行派發(fā),那么我們?cè)谶@里就寫個(gè)繼承EventQueue這個(gè)類,攔截所有的事件并對(duì)其進(jìn)行處理,我們的文本組件都是繼承與JTextComponent的,那么到這里我們就能為所有的文本組件定制一致的菜單了。效果如:
         



    見代碼:
    package org.kissjava.swingx.core;

    import java.awt.AWTEvent;
    import java.awt.Component;
    import java.awt.EventQueue;
    import java.awt.Point;
    import java.awt.Toolkit;
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.Transferable;
    import java.awt.event.ActionEvent;
    import java.awt.event.MouseEvent;

    import javax.swing.AbstractAction;
    import javax.swing.JPopupMenu;
    import javax.swing.MenuSelectionManager;
    import javax.swing.SwingUtilities;
    import javax.swing.text.JTextComponent;

    public class KJEventQueue extends EventQueue {
        @Override
         
    protected void dispatchEvent(AWTEvent event)
                
    super.dispatchEvent(event); 
         
                
    // interested only in mouseevents 
                if(!(event instanceof MouseEvent)) 
                    
    return
         
                MouseEvent me 
    = (MouseEvent)event; 
         
                
    // interested only in popuptriggers 
                if(!me.isPopupTrigger()) 
                    
    return
         
                
    // me.getComponent() retunrs the heavy weight component on which event occured 
                Component comp = SwingUtilities.getDeepestComponentAt(me.getComponent(), me.getX(), me.getY()); 
         
                
    // interested only in textcomponents 
                if(!(comp instanceof JTextComponent)) 
                    
    return
         
                
    // no popup shown by user code 
                if(MenuSelectionManager.defaultManager().getSelectedPath().length>0
                    
    return
         
                
    // create popup menu and show 
                JTextComponent tc = (JTextComponent)comp; 
                JPopupMenu menu 
    = new JPopupMenu(); 
                menu.add(
    new CutAction(tc)); 
                menu.add(
    new CopyAction(tc)); 
                menu.add(
    new PasteAction(tc)); 
                menu.add(
    new DeleteAction(tc)); 
                menu.addSeparator(); 
                menu.add(
    new SelectAllAction(tc)); 
                
                Point pt 
    = SwingUtilities.convertPoint(me.getComponent(), me.getPoint(), tc);
                menu.show(tc, pt.x, pt.y);
            }
     
         
    class CutAction extends AbstractAction
                JTextComponent comp; 
             
                
    public CutAction(JTextComponent comp)
                    
    super("Cut"); 
                    
    this.comp = comp; 
                }
     
             
                
    public void actionPerformed(ActionEvent e)
                    comp.cut(); 
                }
     
             
                
    public boolean isEnabled()
                    
    return comp.isEditable() 
                            
    && comp.isEnabled() 
                            
    && comp.getSelectedText()!=null
                }
     
            }
     
             
            
    // @author Santhosh Kumar T - santhosh@in.fiorano.com 
            class PasteAction extends AbstractAction
                JTextComponent comp; 
             
                
    public PasteAction(JTextComponent comp)
                    
    super("Paste"); 
                    
    this.comp = comp; 
                }
     
             
                
    public void actionPerformed(ActionEvent e)
                    comp.paste(); 
                }
     
             
                
    public boolean isEnabled()
                    
    if (comp.isEditable() && comp.isEnabled())
                        Transferable contents 
    = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this); 
                        
    return contents.isDataFlavorSupported(DataFlavor.stringFlavor); 
                    }
    else 
                        
    return false
                }
     
            }
     
             
            
    // @author Santhosh Kumar T - santhosh@in.fiorano.com 
            class DeleteAction extends AbstractAction
                JTextComponent comp; 
             
                
    public DeleteAction(JTextComponent comp)
                    
    super("Delete"); 
                    
    this.comp = comp; 
                }
     
             
                
    public void actionPerformed(ActionEvent e)
                    comp.replaceSelection(
    null); 
                }
     
             
                
    public boolean isEnabled()
                    
    return comp.isEditable() 
                            
    && comp.isEnabled() 
                            
    && comp.getSelectedText()!=null
                }
     
            }
     
             
            
    // @author Santhosh Kumar T - santhosh@in.fiorano.com 
            class CopyAction extends AbstractAction
                JTextComponent comp; 
             
                
    public CopyAction(JTextComponent comp)
                    
    super("Copy"); 
                    
    this.comp = comp; 
                }
     
             
                
    public void actionPerformed(ActionEvent e)
                    comp.copy(); 
                }
     
             
                
    public boolean isEnabled()
                    
    return comp.isEnabled() 
                            
    && comp.getSelectedText()!=null
                }
     
            }
     
             
            
    // @author Santhosh Kumar T - santhosh@in.fiorano.com 
            class SelectAllAction extends AbstractAction
                JTextComponent comp; 
             
                
    public SelectAllAction(JTextComponent comp)
                    
    super("Select All"); 
                    
    this.comp = comp; 
                }
     
             
                
    public void actionPerformed(ActionEvent e)
                    comp.selectAll(); 
                }
     
             
                
    public boolean isEnabled()
                    
    return comp.isEnabled() 
                            
    && comp.getText().length()>0
                }
     
            }
     
    }


           到這里我們?nèi)绾问褂眠@個(gè)類呢?也很簡單,只要在主程序的入口處加上下面這句就行了:
    Toolkit.getDefaultToolkit().getSystemEventQueue().push(new KJEventQueue()); 

                也就是在main方法中調(diào)用,如:
     

    public static void main(String[] args) {
            Toolkit.getDefaultToolkit().getSystemEventQueue().push(
    new KJEventQueue()); 
            
    // TODO Auto-generated method stub
            SwingUtilities.invokeLater(new Runnable(){
                
    public void run(){
                    
    new KJEventQuequeDemo();
                }

            }
    );
        }



    資料來源:http://www.jroller.com/santhosh/entry/context_menu_for_textcomponents

    posted on 2009-06-27 23:31 kissjava 閱讀(1392) 評(píng)論(4)  編輯  收藏 所屬分類: swing

    評(píng)論

    # re: Swing中為文本組件定制統(tǒng)一的菜單 2009-06-28 21:58 rochoc
    不錯(cuò),學(xué)習(xí)了,謝謝  回復(fù)  更多評(píng)論
      

    # re: Swing中為文本組件定制統(tǒng)一的菜單 2009-06-28 23:50 zht
    Santhosh 是個(gè)人才  回復(fù)  更多評(píng)論
      

    # re: Swing中為文本組件定制統(tǒng)一的菜單 2009-06-29 00:03 枯寬
    @zht
    的確,最近沒事都在看他以前的文章  回復(fù)  更多評(píng)論
      

    # re: Swing中為文本組件定制統(tǒng)一的菜單 2009-07-01 13:26 找個(gè)美女做老婆
    Java高手群:Java樂園,群號(hào):28840096 Java樂園網(wǎng)站:http://www.javaly.cn 歡迎Java高手加入,大家一起交流經(jīng)驗(yàn),相互學(xué)習(xí),共同進(jìn)步  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 啦啦啦中文在线观看电视剧免费版 | 色吊丝最新永久免费观看网站| 成年人免费的视频| 免费无码又爽又刺激高潮的视频| 亚洲老熟女@TubeumTV| 国产精品亚洲一区二区麻豆| 美女黄网站人色视频免费| a在线视频免费观看在线视频三区 a毛片成人免费全部播放 | www.亚洲一区| 亚洲自偷自偷精品| 最新亚洲人成无码网www电影| 国产伦精品一区二区免费| 最近中文字幕免费2019| 免费A级毛片在线播放不收费| 亚洲av成人无码久久精品| 亚洲 欧洲 自拍 另类 校园| 无码一区二区三区AV免费| 亚洲韩国精品无码一区二区三区 | 一级做a爰片性色毛片免费网站 | 亚洲精品免费观看| 国产成人在线免费观看| 亚洲国产精久久久久久久| 无遮挡国产高潮视频免费观看| 国产国拍亚洲精品福利| 国产亚洲精品VA片在线播放| 日韩一级免费视频| 中文字幕 亚洲 有码 在线| 日韩电影免费在线观看网站| 男女啪啪永久免费观看网站| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 亚洲AV无码专区亚洲AV伊甸园| 黄色网址免费在线| 亚洲成在人线av| 亚洲免费视频一区二区三区| 国产AV无码专区亚洲AVJULIA| 免费观看黄色的网站| 亚洲天堂中文字幕| 日韩在线视频免费看| 三年片在线观看免费| 亚洲av无码不卡久久| 9277手机在线视频观看免费|