http://blogs.oracle.com/geertjan/?page=6

——————————————————————————————————————————————————————————————————————

Look at the Zoom buttons in the extreme left of the toolbar below. In the first screenshot, the selected window does not require zoomability, hence the buttons are disabled...

...while in this window, we imagine an image of some kind that should be zoomable, hence the Zoom buttons are enabled:

Jesse created the above solution as part of VisiTrend's NDVis:

http://sourceforge.net/projects/ndvis/develop

Here's a step by step instruction to achieve the above.

  1. First, let's create an interface that we'll require components to publish in order to be zoomable:

    package org.zoom.solution;
    
    /\*\* \* Should be in the lookup of a component that can be zoomed. \*/public interface Zoomable {
    
        enum Mode {IN, OUT}
    
        void setMode(Mode mode);
    
    }
  2. Then, here's the constructor of the ImageTopComponent, where we put the Zoomable implementation into the TopComponent's Lookup:
    public ImageTopComponent() {    initComponents();    setName(NbBundle.getMessage(ImageTopComponent.class, "CTL_ImageTopComponent"));    setToolTipText(NbBundle.getMessage(ImageTopComponent.class, "HINT_ImageTopComponent"));
    
        final ZoomHelper zoomHelper = new ZoomHelper(this);
    
        Zoomable z = new Zoomable() {        @Override        public void setMode(Mode mode) {            zoomHelper.setZoom(mode);        }    };
    
        associateLookup(Lookups.singleton(z));
    
    }

    The helper class referred to above is something like this (for the complete source, see the NDVis reference above):

    class ZoomHelper {
    
        private final TopComponent panel;
    
        public ZoomHelper(TopComponent panel) {        this.panel = panel;    }
    
        private ToggleButtonMouseListener ToggleButtonMouseListener;
    
        public void setZoom(Zoomable.Mode mode) {        panel.removeMouseListener(ToggleButtonMouseListener);        switch (mode) {        case IN: {            ToggleButtonMouseListener = new ToggleButtonMouseListener(1.1);            panel.addMouseListener(ToggleButtonMouseListener);            ImageIcon ICON = ImageUtilities.loadImageIcon("org/zoom/solution/zoomin.gif", true);            Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(ICON.getImage(), new Point(0, 0), "ZOOMIN");            panel.setCursor(c);            StatusDisplayer.getDefault().setStatusText("Zoom in enabled...");        }            break;        case OUT: {            ToggleButtonMouseListener = new ToggleButtonMouseListener(0.9);            panel.addMouseListener(ToggleButtonMouseListener);            ImageIcon ICON = ImageUtilities.loadImageIcon("org/zoom/solution/zoomout.gif", true);            Cursor c = Toolkit.getDefaultToolkit().createCustomCursor(ICON.getImage(), new Point(0, 0), "ZOOMOUT");            panel.setCursor(c);            StatusDisplayer.getDefault().setStatusText("Zoom out enabled...");        }            break;        default:            throw new AssertionError();        }    }
    
        private class ToggleButtonMouseListener implements MouseListener {
    
            private final double zoomFactor;
    
            public ToggleButtonMouseListener(double zoomFactor) {            this.zoomFactor = zoomFactor;        }
    
            @Override        public void mousePressed(MouseEvent evt) {            if (SwingUtilities.isLeftMouseButton(evt)) {                //Somehow do your zooming now:                //ZoomUtility.zoom(panel, evt.getPoint(), zoomFactor);            }        }
    
            @Override        public void mouseReleased(MouseEvent e) {        }
    
            @Override        public void mouseClicked(MouseEvent e) {        }
    
            @Override        public void mouseEntered(MouseEvent e) {        }
    
            @Override        public void mouseExited(MouseEvent e) {        }
    
        }
    
    }
  3. So, now we have an implementation of Zoomable in the Lookup of our TopComponent. That's what all TopComponents would do to integrate with the Zoom functionality.

    The Zoomable implementation is published. Now our buttons should subscribe to it. Here's a JToggleButton that will be displayed via Presenter.Toolbar in the next step. We create a ButtonGroup for the toggle effect, a LookupListener subscribed to Zoomable implementations, and an ItemListener for notifications when a different button is selected:

    import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.util.Collection;import javax.swing.ButtonGroup;import javax.swing.JToggleButton;import org.openide.util.Lookup;import org.openide.util.LookupEvent;import org.openide.util.LookupListener;import org.openide.util.Utilities;import org.openide.util.WeakListeners;
    
    class ZoomableModeButton extends JToggleButton implements LookupListener, ItemListener {
    
        private static final ButtonGroup bg = new ButtonGroup();    private static final Lookup.Result<Zoomable> zoomables = Utilities.actionsGlobalContext().lookupResult(Zoomable.class);
    
        private final Zoomable.Mode mode;
    
        public ZoomableModeButton(Zoomable.Mode mode, String label) {        super(label);        this.mode = mode;        bg.add(this);        setEnabled(false);        addItemListener(this);        zoomables.addLookupListener(WeakListeners.create(LookupListener.class, this, zoomables));    }
    
        @Override    public void resultChanged(LookupEvent ev) {        change();    }
    
        @Override    public void itemStateChanged(ItemEvent e) {        change();    }
    
        private void change() {        Collection<? extends Zoomable> z = zoomables.allInstances();        if (z.size() == 1) {            setEnabled(true);            if (isSelected()) {                z.iterator().next().setMode(mode);            }        } else {            setEnabled(false);        }    }
    
    }

    We check that there's one Zoomable available, then set the enablement of the button, and use the mode of the current Zoomable for the selected button.

  4. Finally, here are the two Actions that will be presented as JToggleButtons:
    @ActionID(id = "com.visitrend.ndvis.actions.ZoomInAction", category = "NDVisActions")@ActionRegistration(displayName = "Zoom In")@ActionReference(path = "Toolbars/File", position = 10)public class ZoomInAction extends AbstractAction implements Presenter.Toolbar {
    
        @Override    public void actionPerformed(ActionEvent e) {        assert false;    }
    
        @Override    public Component getToolbarPresenter() {        return new ZoomableModeButton(Zoomable.Mode.IN, "Zoom In");    }
    
    }
    @ActionID(id = "com.visitrend.ndvis.actions.ZoomOutAction", category = "NDVisActions")@ActionRegistration(displayName = "Zoom Out")@ActionReference(path = "Toolbars/File", position = 20)public class ZoomOutAction extends AbstractAction implements Presenter.Toolbar {
    
        @Override    public void actionPerformed(ActionEvent e) {        assert false;    }
    
        @Override    public Component getToolbarPresenter() {        return new ZoomableModeButton(Zoomable.Mode.OUT, "Zoom Out");    }
    
    }

That's it. Thanks, Jesse.

Zoom Capability相关推荐

  1. github中的常用库

    awesome-android 原文链接:http://snowdream.github.io/awesome-android/#UI android libs from github Downloa ...

  2. Google Pixel 超分辨率--Super Resolution Zoom

    Google Pixel 超分辨率–Super Resolution Zoom Google 的Super Res Zoom技术,主要用于在zoom时增强画面细节以及提升在夜景下的效果. 文章的主要贡 ...

  3. 如何在SharePoint2010中添加Deep Zoom Image

    如何在SharePoint2010中添加Deep Zoom Image 应用范围 SharePoint 2010 Foundation:SharePoint 2010 Standard:SharePo ...

  4. UE capability与 双连接相关的参数。

    UE capability 分为 Network capability 和 Radio capability, 即网络能力和无线能力. Netowrk Capability UE 在做Attach R ...

  5. 如何改变一个地图的Zoom单位

    mapControl1.Map.Zoom = new MapInfo.Geometry.Distance(mapControl1.Map.Zoom.value,MapInfo.Geometry.Dis ...

  6. 【MATLAB】交互式绘图(ginput,gtext,zoom)

    1.ginput指令: [x,y]=ginput(n)              %(其功能是用鼠标从二维图形中获取n个点的数据坐标) x=-8*pi:pi/100:8*pi; y1=sin(x); ...

  7. 客户花钱雇黑客,竟是为Zoom找bug:风口浪尖的视频会议No.1,安全问题如此魔幻...

    白交 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 客户花钱找黑客,帮你产品找Bug-- 这样的客户哪里找?这样的产品又究竟有怎样的福报? Zoom,疫情之下最火爆的视频会议公司,又上演 ...

  8. zoom:1是什么意思

    当一个容器内元素都浮动后,它将高度将不会随着内部元素高度的增加而增加,所以造成内容元素的显示超出了容器. overflow:auto;是让高度自适应, zoom:1;是为了兼容IE6,也可以用heig ...

  9. R语言使用gganimate包和ggforce包可视化动画并动态缩放(zoom)移动动画的内容

    R语言使用gganimate包和ggforce包可视化动画并动态缩放(zoom)移动动画的内容 目录 R语言使用gganimate包和ggforce包可视化动画并动态缩放(zoom)移动

最新文章

  1. mysql 二进制日志
  2. 3dmax挤出制作窗花_给想学3dmax,又不知如何快速入手的你 新手学习3dmax的建议...
  3. .NET资源文件实现多语言切换
  4. SEO配置信息操作文档
  5. 【学员分享】程序员效率神器,最常用VIM插件安装大全
  6. 用 UrlRewriteFilter 实现 URL 重写
  7. coverity代码检测工具介绍_兴业证券:静态代码检测最佳实践
  8. py获取前端的参数_微前端 qiankun 项目实践
  9. 面试官 | 说一下什么是代理模式?
  10. qt TCP 网络编程
  11. 从青铜到王者的路线,javasocket编程聊天室
  12. 监测资金流向原来这么简单?
  13. 三八定律时间管理思想
  14. ET城市大脑发布“天擎”系统:处理16小时视频仅用1分钟
  15. RPA助你一键轻松完成财务报表
  16. 采购申请屏幕以及BAPI增强
  17. 【运筹学】对偶理论 : 总结 ( 对偶理论 | 原问题与对偶问题对应关系 | 对偶理论的相关结论 ) ★★★
  18. 少儿编程scratch一级考试试卷真题及讲解(一)
  19. Android 在线升级APK
  20. stm32f4 adc 使用

热门文章

  1. golang image.image 转文件流_Kuiper 1.0.2 正式发布 超轻量 IoT 边缘流处理
  2. 如何利用 nbconvert将 IPYNB文档转换 Markdown文档?
  3. 智慧农场-专项启动会议
  4. 第十六届全国大学生智能车竞赛全国总决赛报名信息汇总
  5. 第十六届全国大学生智能汽车竞赛总决赛 AI视觉组线上赛细则
  6. 第十六届全国大学生智能车竞赛组委会第三次扩大会议
  7. 2021年春季学期-信号与系统-第四次作业参考答案-第六小题
  8. installshield 安装文件属性的原始文件名 如何修改_iPhone修改微信提示音,iOS12可用,无需越狱详细教程...
  9. word删除分节符后之前的格式乱了_毕业论文Word技巧小结
  10. java 停顿 分钟_java - 年轻的垃圾收集更长时间停顿与Java 7 vs java 6 - 堆栈内存溢出...