如何在开放式办公室中将JFrame添加到对话框?

时间:2016-06-17 08:40:28

标签: java openoffice-calc uno

Jframe的父级需要是电子表格,我需要在运行时在开放式办公室中创建的对话框中添加Jframe。因此,禁用电子表格进行处理,单击按钮,只能在包含JFrame的对话框中完成工作。我正在使用java,UNO。 我试图关注Creating dialog at runtime in open office

    package com.example;

import com.sun.star.awt.ActionEvent;
   import com.sun.star.awt.XButton;
   import com.sun.star.awt.XControl;
   import com.sun.star.awt.XControlContainer;
   import com.sun.star.awt.XControlModel;
   import com.sun.star.awt.XDialog;
   import com.sun.star.awt.XFixedText;
   import com.sun.star.awt.XListBox;
   import com.sun.star.awt.XToolkit;
   import com.sun.star.awt.XWindow;
   import com.sun.star.beans.XMultiPropertySet;
   import com.sun.star.beans.XPropertySet;
   import com.sun.star.container.XNameContainer;
   import com.sun.star.lang.EventObject;
   import com.sun.star.lang.XComponent;
   import com.sun.star.lang.XMultiComponentFactory;
   import com.sun.star.lang.XMultiServiceFactory;
   import com.sun.star.lang.XSingleComponentFactory;
   import com.sun.star.lib.uno.helper.Factory;
   import com.sun.star.lib.uno.helper.WeakBase;
   import com.sun.star.registry.XRegistryKey;
   import com.sun.star.uno.UnoRuntime;
   import com.sun.star.uno.XComponentContext;
      public final class AddOn extends WeakBase
        implements com.sun.star.frame.XDispatchProvider,
        com.sun.star.frame.XDispatch,
        com.sun.star.lang.XServiceInfo,
        com.sun.star.lang.XInitialization {

    private final XComponentContext m_xContext;
    private com.sun.star.frame.XFrame m_xFrame;
    private static final String m_implementationName = AddOn.class
            .getName();
    private static final String[] m_serviceNames = {
        "com.sun.star.frame.ProtocolHandler"};
    private static final String _buttonName = "Button1";
    private static final String _cancelButtonName = "CancelButton";
    private static final String _labelName = "Label1";
    private static final String _labelPrefix = "Number of button clicks: ";
    protected XNameContainer m_xDlgModelNameContainer;

    protected XMultiServiceFactory m_xMSFDialogModel;
      public AddOn(XComponentContext context) {
        m_xContext = context;
    }

    ;

    public static XSingleComponentFactory __getComponentFactory(String sImplementationName) {
        XSingleComponentFactory xFactory = null;

        if (sImplementationName.equals(m_implementationName)) {
            xFactory = Factory.createComponentFactory(AddOn.class, m_serviceNames);
        }
        return xFactory;
    }

    public static boolean __writeRegistryServiceInfo(XRegistryKey xRegistryKey) {
        return Factory.writeRegistryServiceInfo(m_implementationName,
                m_serviceNames,
                xRegistryKey);
    }

    // com.sun.star.frame.XDispatchProvider:
    public com.sun.star.frame.XDispatch queryDispatch(com.sun.star.util.URL aURL,
            String sTargetFrameName,
            int iSearchFlags) {
        if (aURL.Protocol.compareTo("com.example.addon:") == 0) {
            if (aURL.Path.compareTo("Command0") == 0) {
                return this;
            }
            if (aURL.Path.compareTo("Command1") == 0) {
                return this;
            }
            if (aURL.Path.compareTo("Command2") == 0) {
                return this;
            }
        }
        return null;
    }

    // com.sun.star.frame.XDispatchProvider:
    public com.sun.star.frame.XDispatch[] queryDispatches(
            com.sun.star.frame.DispatchDescriptor[] seqDescriptors) {
        int nCount = seqDescriptors.length;
        com.sun.star.frame.XDispatch[] seqDispatcher
                = new com.sun.star.frame.XDispatch[seqDescriptors.length];

        for (int i = 0; i < nCount; ++i) {
            seqDispatcher[i] = queryDispatch(seqDescriptors[i].FeatureURL,
                    seqDescriptors[i].FrameName,
                    seqDescriptors[i].SearchFlags);
        }
        return seqDispatcher;
    }
    // com.sun.star.frame.XDispatch:
    public void dispatch(com.sun.star.util.URL aURL,
            com.sun.star.beans.PropertyValue[] aArguments) {
        if (aURL.Protocol.compareTo("com.example.addon:") == 0) {
            if (aURL.Path.compareTo("Command0") == 0) {
                // add your own code here
                trigger("execute");
                return;
            }
            if (aURL.Path.compareTo("Command1") == 0) {
                // add your own code here
                return;
            }
            if (aURL.Path.compareTo("Command2") == 0) {
                // add your own code here
                return;
            }
        }
    }

    public void addStatusListener(com.sun.star.frame.XStatusListener xControl,
            com.sun.star.util.URL aURL) {
        // add your own code here
    }

    public void removeStatusListener(com.sun.star.frame.XStatusListener xControl,
            com.sun.star.util.URL aURL) {
        // add your own code here
    }

    // com.sun.star.lang.XServiceInfo:
    public String getImplementationName() {
        return m_implementationName;
    }

    public boolean supportsService(String sService) {
        int len = m_serviceNames.length;

        for (int i = 0; i < len; i++) {
            if (sService.equals(m_serviceNames[i])) {
                return true;
            }
        }
        return false;
    }

    public String[] getSupportedServiceNames() {
        return m_serviceNames;
    }

    // com.sun.star.lang.XInitialization:
    public void initialize(Object[] object)
            throws com.sun.star.uno.Exception {
        if (object.length > 0) {
            m_xFrame = (com.sun.star.frame.XFrame) UnoRuntime.queryInterface(
                    com.sun.star.frame.XFrame.class, object[0]);
        }
    }

    // XJobExecutor
    public void trigger(String sEvent) {
        if (sEvent.compareTo("execute") == 0) {
            try {
                createDialog();
            } catch (Exception e) {
                throw new com.sun.star.lang.WrappedTargetRuntimeException(e.getMessage(), this, e);
            }
        }
    }

    /**
     * method for creating a dialog at runtime
     */
    private void createDialog() throws com.sun.star.uno.Exception {

        // get the service manager from the component context
        XMultiComponentFactory xMultiComponentFactory = m_xContext.getServiceManager();

        // create the dialog model and set the properties
        Object dialogModel = xMultiComponentFactory.createInstanceWithContext(
                "com.sun.star.awt.UnoControlDialogModel", m_xContext);
        XPropertySet xPSetDialog = (XPropertySet) UnoRuntime.queryInterface(
                XPropertySet.class, dialogModel);
        xPSetDialog.setPropertyValue("PositionX", 100);
        xPSetDialog.setPropertyValue("PositionY", 100);
        xPSetDialog.setPropertyValue("Width", 150);
        xPSetDialog.setPropertyValue("Height", 200);
        xPSetDialog.setPropertyValue("Title", "Runtime Dialog Button Demo");

        // get the service manager from the dialog model
        XMultiServiceFactory xMultiServiceFactory = (XMultiServiceFactory) UnoRuntime.queryInterface(
                XMultiServiceFactory.class, dialogModel);

        // create the button model and set the properties
        Object buttonModel = xMultiServiceFactory.createInstance(
                "com.sun.star.awt.UnoControlButtonModel");
        XPropertySet xPSetButton = (XPropertySet) UnoRuntime.queryInterface(
                XPropertySet.class, buttonModel);
        xPSetButton.setPropertyValue("PositionX", 20);
        xPSetButton.setPropertyValue("PositionY", 70);
        xPSetButton.setPropertyValue("Width", 50);
        xPSetButton.setPropertyValue("Height", 14);
        xPSetButton.setPropertyValue("Name", _buttonName);
        xPSetButton.setPropertyValue("TabIndex", (short) 0);
        xPSetButton.setPropertyValue("Label", "Click Me");

        // create the label model and set the properties
        Object labelModel = xMultiServiceFactory.createInstance(
                "com.sun.star.awt.UnoControlFixedTextModel");
        XPropertySet xPSetLabel = (XPropertySet) UnoRuntime.queryInterface(
                XPropertySet.class, labelModel);
        xPSetLabel.setPropertyValue("PositionX", new Integer(40));
        xPSetLabel.setPropertyValue("PositionY", new Integer(30));
        xPSetLabel.setPropertyValue("Width", new Integer(100));
        xPSetLabel.setPropertyValue("Height", new Integer(14));
        xPSetLabel.setPropertyValue("Name", _labelName);
        xPSetLabel.setPropertyValue("TabIndex", new Short((short) 1));
        xPSetLabel.setPropertyValue("Label", _labelPrefix);

        // create a Cancel button model and set the properties
        Object cancelButtonModel = xMultiServiceFactory.createInstance(
                "com.sun.star.awt.UnoControlButtonModel");
        XPropertySet xPSetCancelButton = (XPropertySet) UnoRuntime.queryInterface(
                XPropertySet.class, cancelButtonModel);
        xPSetCancelButton.setPropertyValue("PositionX", new Integer(80));
        xPSetCancelButton.setPropertyValue("PositionY", new Integer(70));
        xPSetCancelButton.setPropertyValue("Width", new Integer(50));
        xPSetCancelButton.setPropertyValue("Height", new Integer(14));
        xPSetCancelButton.setPropertyValue("Name", _cancelButtonName);
        xPSetCancelButton.setPropertyValue("TabIndex", new Short((short) 2));
        xPSetCancelButton.setPropertyValue("PushButtonType", new Short((short) 2));
        xPSetCancelButton.setPropertyValue("Label", new String("Cancel"));

// insert the control models into the dialog model
        XNameContainer xNameCont = (XNameContainer) UnoRuntime.queryInterface(
                XNameContainer.class, dialogModel);
        xNameCont.insertByName(_buttonName, buttonModel);
        xNameCont.insertByName(_labelName, labelModel);
        xNameCont.insertByName(_cancelButtonName, cancelButtonModel);

        // create the dialog control and set the model
        Object dialog = xMultiComponentFactory.createInstanceWithContext(
                "com.sun.star.awt.UnoControlDialog", m_xContext);
        XControl xControl = (XControl) UnoRuntime.queryInterface(
                XControl.class, dialog);
        XControlModel xControlModel = (XControlModel) UnoRuntime.queryInterface(
                XControlModel.class, dialogModel);
        xControl.setModel(xControlModel);

        // add an action listener to the button control
        XControlContainer xControlCont = (XControlContainer) UnoRuntime.queryInterface(
                XControlContainer.class, dialog);
        Object objectButton = xControlCont.getControl("Button1");
        XButton xButton = (XButton) UnoRuntime.queryInterface(
                XButton.class, objectButton);
        xButton.addActionListener(new ActionListenerImpl(xControlCont));

        // create a peer
        Object toolkit = xMultiComponentFactory.createInstanceWithContext(
                "com.sun.star.awt.ExtToolkit", m_xContext);
        XToolkit xToolkit = (XToolkit) UnoRuntime.queryInterface(
                XToolkit.class, toolkit);
        XWindow xWindow = (XWindow) UnoRuntime.queryInterface(
                XWindow.class, xControl);
        xWindow.setVisible(false);
        xControl.createPeer(xToolkit, null);

        // execute the dialog
        XDialog xDialog = (XDialog) UnoRuntime.queryInterface(
                XDialog.class, dialog);
        xDialog.execute();

        // dispose the dialog
        XComponent xComponent = (XComponent) UnoRuntime.queryInterface(
                XComponent.class, dialog);
        xComponent.dispose();

    }

    /**
     * action listener
     */
    public class ActionListenerImpl implements com.sun.star.awt.XActionListener {

        private int _nCounts = 0;

        private XControlContainer _xControlCont;

        public ActionListenerImpl(XControlContainer xControlCont) {
            _xControlCont = xControlCont;
        }

        // XEventListener
        public void disposing(EventObject eventObject) {
            _xControlCont = null;
        }

        // XActionListener
        public void actionPerformed(ActionEvent actionEvent) {

            // increase click counter
            _nCounts++;

            // set label text
            Object label = _xControlCont.getControl("Label1");
            XFixedText xLabel = (XFixedText) UnoRuntime.queryInterface(
                    XFixedText.class, label);
            xLabel.setText(_labelPrefix + _nCounts);
        }
    }
}

这是一个示例项目,我可以在开放式办公室上创建一个对话框,但我的下一个任务,问题是如何将JFrame添加到对话框中。

我也试过这个

    public void addConfigToDialog() throws Exception { // to be tested
        setIdsconfig(IDSConfig.getIDSConfigObject(getM_xContext(), getXcomponent()));//calls singleton method for IDSConfig
        JDialog dialog = new JDialog(getIdsconfig());
        showModal(dialog);
    }

    public void showModal(javax.swing.JDialog dialog) {
        try {
            XMultiComponentFactory multiComponentFactory = m_xContext.getServiceManager();

            // create the dialog model and set the properties
            Object tempDialogModel
                    = multiComponentFactory.createInstanceWithContext("com.sun.star.awt.UnoControlDialogModel",
                            m_xContext);
            XPropertySet properties = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, tempDialogModel);
            properties.setPropertyValue("PositionX", new Integer(0));
            properties.setPropertyValue("PositionY", new Integer(0));
            properties.setPropertyValue("Width", new Integer(150));
            properties.setPropertyValue("Height", new Integer(100));
//            properties.setPropertyValue("Enabled", false);
            final Object tempDialog
                    = multiComponentFactory.createInstanceWithContext("com.sun.star.awt.UnoControlDialog",
                            m_xContext);
            XControl xControl = (XControl) UnoRuntime.queryInterface(XControl.class, tempDialog);
            XControlModel xControlModel = (XControlModel) UnoRuntime.queryInterface(XControlModel.class, tempDialogModel);
            xControl.setModel(xControlModel);

            Object toolkit
                    = multiComponentFactory.createInstanceWithContext("com.sun.star.awt.Toolkit",
                            m_xContext);
            XToolkit xToolkit = (XToolkit) UnoRuntime.queryInterface(XToolkit.class, toolkit);
            XWindow xWindow = (XWindow) UnoRuntime.queryInterface(XWindow.class, xControl);
            xWindow.setVisible(false);//changed
            xControl.createPeer(xToolkit, null);

            final XDialog xTempDialog = (XDialog) UnoRuntime.queryInterface(XDialog.class, tempDialog);
            dialog.addWindowListener(new WindowAdapter() {
                public void windowClosed(WindowEvent e) {
                    xTempDialog.endExecute();
                    XComponent component = (XComponent) UnoRuntime.queryInterface(XComponent.class, tempDialog);
                    component.dispose();
                }
            });

            dialog.setVisible(true);
            xTempDialog.execute();

        } catch (com.sun.star.uno.Exception ex) {
            ex.printStackTrace();
        }
    }

我使用了这段代码,但在将Jframe的数据转换为openoffice对话框时遇到了问题。我在开放式办公电子表格中的一个按钮上调用addConfigToDialog()。

2 个答案:

答案 0 :(得分:0)

有几种选择,但我不认为你的要求是可能的。

  1. 我建议只使用OpenOffice对话框,并重写JFrame功能以改为使用UNO API。这就是你的例子的工作原理。

  2. 或者,您可以创建Java swing窗口,而不是创建OpenOffice对话框。一个例子是ScriptSelector。然后窗口将独立于OpenOffice运行,并且可以轻松地显示在OpenOffice窗口后面而不是前面。应该可以锁定OpenOffice窗口控制器以防止编辑。

  3. 或者用Java创建一个窗口化的AWT应用程序,并使用OOBean嵌入一个OpenOffice窗口。

答案 1 :(得分:0)

我没有找到任何解决方案如何在开放式办公室中添加Jframe到对话框,而是我发现另一种方法是锁定容器窗口,将XFrame传递给JFrame的参数。我可以使用开放式办公室的窗口事件和java.awt.event的窗口事件并使用

XDesktop desktop;//get the current desktop object being used
desktop.getCurrentFrame().getContainerWindow().setEnable(false);// uses uno component window methods and uno objects methods

然后在

中启用它
JFrame jFrame;//get the JFrame being used
jFrame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e)
{
getxDesktop().getCurrentFrame().getContainerWindow().setEnable(true);//get Xdesktop being in used and enable the containerWindow to true
}
});

启用容器窗口,以便解锁电子表格。 请记住,有必要通过启用containerWindow来解锁电子表格,否则您的文档被锁定,并且只能通过取消uno-run项目或通过结束任务管理器中的相关进程或通过终端中的命令来关闭。