莫相离 发表于 2015-1-18 11:20:44

发布一篇Swing中为文本组件定制一致的菜单

你说是sun公司对她研究的透还是微软?针对自己工具开发的.net网页编程性能上肯定会站上风的。
在良多软件中每一个文本组件都有自界说的菜单,这个blogjava的编纂器就有如许的菜单如:Cut,Copy,Paste,Delete,SelectAll,在Swing中若也想在JTextField,JTextArea,JEditorPane,JTextPane等等这些组件中都供应云云自界说菜单的功效,每一个都写承继类?大概加鼠标监听事务?但不论如何弄城市完成效果,只不外如许动态很年夜,欠好保护,明天在网上看到一个非常便利的办法。
人人都晓得,Swing中一切的事务都是进进java.awt.EventQueue这个行列中守候,然后经由过程dispatchEvent办法举行派发,那末我们在这里就写个承继EventQueue这个类,拦阻一切的事务并对其举行处置,我们的文本组件都是承继与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;
            }
        }
}
到这里我们怎样利用这个类呢?也很复杂,只需在主程序的出口处加高低面这句就好了:
Toolkit.getDefaultToolkit().getSystemEventQueue().push(newKJEventQueue());
也就是在main办法中挪用,如:
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();
            }
        });
    }

唉!都是钱闹的1.Swing和.net网页编程开发比较------从市场份额看.net网页编程开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具

若相依 发表于 2015-1-20 20:50:31

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

乐观 发表于 2015-1-20 20:50:31

不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。

柔情似水 发表于 2015-1-29 05:12:29

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

分手快乐 发表于 2015-2-5 17:42:26

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

小妖女 发表于 2015-2-6 07:56:39

是一种突破用户端机器环境和CPU

老尸 发表于 2015-2-10 06:52:13

是一种为 Internet发展的计算机语言

第二个灵魂 发表于 2015-2-28 23:54:22

是一种突破用户端机器环境和CPU

简单生活 发表于 2015-3-10 10:55:49

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

灵魂腐蚀 发表于 2015-3-17 06:11:26

http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。
页: [1]
查看完整版本: 发布一篇Swing中为文本组件定制一致的菜单