0

jgraph init を使用した jframe があり、jmenu バーを追加しました。このコードを使用してjmenu項目を追加しようとしています。これにより、クリックすると、選択した場所にjgraphが画像としてエクスポートされます。

次のエラーが表示されます。

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: image == null!
    at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(Unknown Source)
    at javax.imageio.ImageIO.getWriter(Unknown Source)
    at javax.imageio.ImageIO.write(Unknown Source)
    at GUIquery$2.actionPerformed(GUIquery.java:440)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

そしてコード:

final static mxGraph graph = new mxGraph() ;
final static mxGraphComponent graphComponent = new mxGraphComponent(graph);

public class GUI extends JFrame  { 
....
public static JMenuBar createMenuBar() { 

JMenuBar menuBar;
                JMenu menu, submenu;
                JMenuItem menuItem;

                //dimiurgia tu menubar

                menuBar = new JMenuBar();

                //1o menu
                menu = new JMenu("Menu");
                menu.setMnemonic(KeyEvent.VK_A);
                menu.getAccessibleContext().setAccessibleDescription("Info");
                menuBar.add(menu);

                // menu items

                menuItem = new JMenuItem("Export as Image",KeyEvent.VK_T);
       menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_1, ActionEvent.ALT_MASK));
  menuItem.getAccessibleContext().setAccessibleDescription("Saves Diagram as Image (.PNG)");
                menuItem.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent event) {


                        try {

                            String filename ="Image";

                            exportImage(filename, graph, graphComponent);


                        }catch (IOException e) {
                            System.out.println("Image could not be read");
                            System.exit(1);
                        }

                    }
                });

                menu.add(menuItem);
                menu.addSeparator();

                //submenu

                submenu = new JMenu("Preferences");
                submenu.setMnemonic(KeyEvent.VK_S);

                 menuItem = new JMenuItem("Option A");
                 menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK));
                 submenu.add(menuItem);

                menuItem = new JMenuItem("Option B");
                menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_3, ActionEvent.ALT_MASK));
                submenu.add(menuItem);

                menu.add(submenu);

                // 2o menu

                menu = new JMenu("View");
                menu.setMnemonic(KeyEvent.VK_N);
                menu.getAccessibleContext().setAccessibleDescription( "View");
                menuBar.add(menu);

                menuItem = new JMenuItem("Info",KeyEvent.VK_A);
                menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_4, ActionEvent.ALT_MASK));
                menuItem.getAccessibleContext().setAccessibleDescription("Info");

                menu.add(menuItem);

                menuItem = new JMenuItem("Flow",KeyEvent.VK_B);
                menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_5, ActionEvent.ALT_MASK));
                menuItem.getAccessibleContext().setAccessibleDescription("Flow");

                menu.add(menuItem);


          menuBar.add(menu);
          return menuBar;

            }


            protected static void exportImage(String filename, mxGraph graph, mxGraphComponent graphComponent) throws IOException{
                BufferedImage image = mxCellRenderer.createBufferedImage(graph, null, 1, Color.WHITE, graphComponent.isAntiAlias(), null,graphComponent.getCanvas());

                // Creates the URL-encoded XML data
                mxCodec codec = new mxCodec();
                String xml = URLEncoder.encode(mxXmlUtils.getXml(codec.encode(graph.getModel())), "UTF-8");

                mxPngEncodeParam param = mxPngEncodeParam.getDefaultEncodeParam(image);
                param.setCompressedText(new String[] { "graph", xml });

                // Saves as a PNG file
                FileOutputStream outputStream = new FileOutputStream(new File(filename));

                try
                {
                    mxPngImageEncoder encoder = new mxPngImageEncoder(outputStream,param);

                    if (image != null)
                    {
                        encoder.encode(image);
                    }
                    else
                    {
                        System.out.println("No Image");
                    }
                }
                finally
                {
                    outputStream.close();
                }
            }
4

1 に答える 1

2

これはあなたが期待する最良の答えではないかもしれませんが、それを得るにはjgraphにお金を払う必要があるようです. いくつかのjgraphライブラリが回答するまで、ヒントが得られるかもしれません。

例外は「java.lang.IllegalArgumentException: image == null!」と言います。ここで、null パラメーターまたは誤動作のいずれかを非難します。

    BufferedImage image = mxCellRenderer.createBufferedImage(graph, null, 1, Color.WHITE,
    graphComponent.isAntiAlias(), null,graphComponent.getCanvas());

次のように null チェックを入れることで確認できます。

    mxPngEncodeParam param = null;

    if(image != null) {
       param = mxPngEncodeParam.getDefaultEncodeParam(image);
    } else {
       System.out.println("No Image in pngparam creation");
       System.exit(1);
    }

または単にいくつかのブレークポイントをデバッグ モードに設定します。

HTH

于 2013-09-19T21:38:28.207 に答える