一年精通帆软报表之设计器菜单栏介绍之一

楼主
插件开发者

帆软报表设计器的菜单栏就是以及

所示的内容, 前面已经说了这些菜单是如何,在哪创建的,当点击这些菜单项时,会调用一系列的Action,这些Action位于fine-report-designer.jar的com.fr.design.actions包下,如图:

 下面就重点来介绍下这些Action。

1 所有的Action都继承自com.fr.design.actions.UpdateAction,这是一个抽象类。这个类实现了javax.swing.Action接口,

2 先来看看Javax.swing.Action接口

        


public void actionPerformed(ActionEvent e);  
public void setEnabled(boolean b);  
public boolean isEnabled();  
public void putValue(String key, Object value);  
public Object getValue(String key);  
public void addPropertyChangeListener(PropertyChangeListener listener);  
public void removePropertyChangeListener(PropertyChangeListener listener); 

actionPerformed方法是ActionListener接口中的一个:实际上,Action接口扩展于ActionListener接口,因此,可以在任何需要ActionListener对象的地方使用Action对象。

  setEnabled和isEnbaled两个方法允许启用或禁用这个动作,并检查这个动作当前是否启用。当一个连接到菜单或工具栏上的动作被禁用时,这个选项就会变成灰色。

  putValue和getValue两个方法允许存储和检索动作对象中的任意名/值,

有两个重要的预定义字符串:Action.NAME和Action.SMALL_ICON,用于将动作的名字和图标存储到一个动作对象中:

action.putValue(Action.NAME,"Blue");  
action.putValue(Action.SMALL_ICON,new ImageIcon("blue-ball.gif"));

表1给出了所有预定义的动作表名称。

                        表1 预定义动作表名称

表1 预定义动作表名称
名称
NAME 动作名称,显示在按钮和菜单上
SMALL_ICON 存储小图标的地方;显示在按钮、菜单项或工具栏中
SHORT_DESCRIPTION 图标的简要说明;显示在工具提示中
LONG_DESCRIPTION 图标的详细说明;使用在在线帮助中。没有Swing组件使用这个值
MNEMONIC_KEY 快捷键缩写;显示在菜单项中
ACCELERATOR_KEY 存储加速击键的地方;Swing组件不使用这个值
ACTION_COMMAND_KEY 历史遗留;仅在旧版本的registerKeyboardAction方法中使用
DEFALUT 常用的综合属性;Swing组件不使用这个值

 如果动作对象添加到菜单或工具栏上,它的名称和图标就会被自动地提取出来,并显示在菜单项或工具栏项中。SHORT_DESCRIPTION值变成了工具提示。

  addPropertyChangeListener和removePropertyChangeListener两个方法能够让其他对象在动作对象的属性发生变化时得到通告,尤其是菜单或工具栏触发的动作。例如,如果增加一个菜单,作为动作对象的属性变更监听器,而这个动作对象爱你个随后被禁用,菜单就会被调用,并将动作名称变为灰色。属性变更监听器是一种常用的构造形式,它是JavaBeans组件模型的一部分。

 

3 介绍完Action接口,下面具体看看UpdateAction的内容。

        

public abstract class UpdateAction extends ShortCut implements Action {

        可以看出UpdateAction继承ShortCut类,实现了Action接口。

    

    private boolean enabled = true;
    private Map<String, Object> componentMap;
    private String searchText = "";

        componentMap存储了putValue放进来的值,也包括这个action管理的组件,enabled属性也控制componentMap中存储的组件的enabled属性,

        

public void setEnabled(boolean newValue) {
        boolean oldValue = this.enabled;
        if (oldValue != newValue) {
            this.enabled = newValue;
            Iterator valueIt = this.componentMap.values().iterator();

            while(valueIt.hasNext()) {
                Object valueObject = valueIt.next();
                if (valueObject instanceof JComponent) {
                    ((JComponent)valueObject).setEnabled(this.enabled);
                }
            }
        }

    }

        可以看出enabled属性控制着componentMap中的组件对象。

    

public void putValue(String key, Object newValue) {
        if (this.componentMap == null) {
            this.componentMap = new HashMap();
        }

        if (newValue == null) {
            this.componentMap.remove(key);
        } else {
            this.componentMap.put(key, newValue);
        }

    }

        存储key-value。

    

public UIMenuItem createMenuItem() {
        Object object = this.getValue(UIMenuItem.class.getName());
        if (object == null && !(object instanceof UIMenuItem)) {
            UIMenuItem menuItem = new UIMenuItem(this);
            menuItem.setName(this.getName());
            this.setPressedIcon4Button(menuItem);
            this.setDisabledIcon4Button(menuItem);
            object = menuItem;
            this.putValue(UIMenuItem.class.getName(), menuItem);
        }

        return (UIMenuItem)object;
    }

创建菜单项。

 public UIMenuEastAttrItem createMenuItemEastAttr() {
        UIMenuEastAttrItem menuItem = new UIMenuEastAttrItem(this);
        menuItem.setName(this.getName());
        this.setPressedIcon4Button(menuItem);
        this.setDisabledIcon4Button(menuItem);
        this.putValue(UIMenuItem.class.getName(), menuItem);
        return menuItem;
    }

创建 菜单East项。

  public JComponent createToolBarComponent() {
        Object object = this.getValue(UIButton.class.getName());
        if (!(object instanceof AbstractButton)) {
            UIButton button = null;
            button = new UIButton();
            object = this.initButton(button, UIButton.class.getName());
        }

        return (JComponent)object;
    }

创建工具栏按钮

public UpdateAction.UseMenuItem createUseMenuItem() {
        Object object = this.getValue(UpdateAction.UseMenuItem.class.getName());
        if (object == null && !(object instanceof UpdateAction.UseMenuItem)) {
            object = new UpdateAction.UseMenuItem(this);
            this.putValue(UpdateAction.UseMenuItem.class.getName(), object);
        }

        this.setPressedIcon4Button((UpdateAction.UseMenuItem)object);
        this.setDisabledIcon4Button((UpdateAction.UseMenuItem)object);
        return (UpdateAction.UseMenuItem)object;
    }

创建 UseMenuItem。

public static UICheckBoxMenuItem createCheckBoxMenuItem(UpdateAction action) {
        UICheckBoxMenuItem menuItem = new UICheckBoxMenuItem(action.getName());
        Integer mnemonicInteger = (Integer)action.getValue("MnemonicKey");
        if (mnemonicInteger != null) {
            menuItem.setMnemonic((char)mnemonicInteger);
        }

        menuItem.setIcon((Icon)action.getValue("SmallIcon"));
        menuItem.addActionListener(action);
        menuItem.setToolTipText((String)action.getValue("LongDescription"));
        menuItem.setAccelerator((KeyStroke)action.getValue("AcceleratorKey"));
        return menuItem;
    }

 创建ChechBox菜单选项。

从上可以看出Action可以创建出工具栏上的按钮,菜单上的选项等。

这个类里面有个跟拼音有关的帮助类:

PinyinHelper.convertToPinyinString(title, "", PinyinFormat.WITHOUT_TONE)将中文转成拼音的帮助类。

里面还有一些其他方法,自己可以去看

更多内容:https://blog.csdn.net/sixingbugai?spm=1000.2115.3001.5343

分享扩散:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0回帖数 1关注人数 3189浏览人数
最后回复于:2021-9-13 10:07

返回顶部 返回列表