0

JMenuBar で [編集] を押すと、アプリで受け取ります

スレッド「AWT-EventQueue-0」での例外 java.lang.NullPointerException
    sun.swing.SwingUtilities2.getLeftSideBearing(SwingUtilities2.java:241) で
    sun.swing.MenuItemLayoutHelper.getLeftExtraWidth(MenuItemLayoutHelper.java:162) で
    sun.swing.MenuItemLayoutHelper.calcExtraWidths(MenuItemLayoutHelper.java:158) で
    sun.swing.MenuItemLayoutHelper.reset(MenuItemLayoutHelper.java:148) で
    sun.swing.MenuItemLayoutHelper.(MenuItemLayoutHelper.java:107) で
    javax.swing.plaf.basic.BasicMenuItemUI.getPreferredMenuItemSize(BasicMenuItemUI.java:408)で
    javax.swing.plaf.basic.BasicMenuItemUI.getPreferredSize(BasicMenuItemUI.java:363)で
    javax.swing.JComponent.getPreferredSize (JComponent.java:1634) で
    javax.swing.BoxLayout.checkRequests(BoxLayout.java:481)で
    javax.swing.BoxLayout.preferredLayoutSize(BoxLayout.java:298) で
    javax.swing.plaf.basic.DefaultMenuLayout.preferredLayoutSize(DefaultMenuLayout.java:60) で
    java.awt.Container.preferredSize (Container.java:1605) で
    java.awt.Container.getPreferredSize (Container.java:1590) で
    javax.swing.JComponent.getPreferredSize (JComponent.java:1636) で
    javax.swing.JMenu.getPopupMenuOrigin (JMenu.java:383) で
    javax.swing.JMenu.setPopupMenuVisible(JMenu.java:349) で
    javax.swing.JPopupMenu.menuSelectionChanged (JPopupMenu.java:1433) で
    javax.swing.MenuSelectionManager.setSelectedPath(MenuSelectionManager.java:117) で
    javax.swing.plaf.basic.BasicMenuUI.appendPath(BasicMenuUI.java:223)
    javax.swing.plaf.basic.BasicMenuUI.access$200 (BasicMenuUI.java:49) で
    javax.swing.plaf.basic.BasicMenuUI$Handler.mousePressed(BasicMenuUI.java:463)で
    java.awt.Component.processMouseEvent(Component.java:6265)で
    javax.swing.JComponent.processMouseEvent(JComponent.java:3267)で
    java.awt.Component.processEvent(Component.java:6033)で
    java.awt.Container.processEvent(Container.java:2045)で
    java.awt.Component.dispatchEventImpl (Component.java:4629) で
    java.awt.Container.dispatchEventImpl (Container.java:2103) で
    java.awt.Component.dispatchEvent(Component.java:4455)で
    java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4633) で
    java.awt.LightweightDispatcher.processMouseEvent(Container.java:4294)で
    java.awt.LightweightDispatcher.dispatchEvent(Container.java:4227)で
    java.awt.Container.dispatchEventImpl (Container.java:2089) で
    java.awt.Window.dispatchEventImpl (Window.java:2517) で
    java.awt.Component.dispatchEvent(Component.java:4455)で
    java.awt.EventQueue.dispatchEventImpl (EventQueue.java:649) で
    java.awt.EventQueue.access$000 (EventQueue.java:96) で
    java.awt.EventQueue$1.run(EventQueue.java:608) で
    java.awt.EventQueue$1.run(EventQueue.java:606) で
    java.security.AccessController.doPrivileged(ネイティブメソッド)で
    java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) で
    java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) で
    java.awt.EventQueue$2.run(EventQueue.java:622) で
    java.awt.EventQueue$2.run(EventQueue.java:620) で
    java.security.AccessController.doPrivileged(ネイティブメソッド)で
    java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) で
    java.awt.EventQueue.dispatchEvent(EventQueue.java:619) で
    java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:275) で
    java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) で
    java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:190) で
    java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) で
    java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) で
    java.awt.EventDispatchThread.run(EventDispatchThread.java:138) で

アプリの何が問題なのかわかりません。コードは次のとおりです。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.undo.*;

public class Jaba extends JFrame {
    public Jaba() {
        super("Hello Swing");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(640, 480);
        setLayout(new FlowLayout());
        txt.getDocument().addUndoableEditListener(undoListener);
        add(txt);
        setJMenuBar(menuBar);
        menuBar.add(editMenu);
        editMenu.add(undoAction);
        editMenu.add(redoAction);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Jaba().setVisible(true);
            }
        });
    }

    private UndoableEditListener undoListener = new UndoableEditListener() {
        @Override
        public void undoableEditHappened(UndoableEditEvent e) {
             undo.addEdit(e.getEdit());
        }        
    };
    private AbstractAction undoAction = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                undo.undo();
            } catch (CannotUndoException ex) {
                System.err.println("Cannon undo");
                ex.printStackTrace();
            }
        }
    };
    private AbstractAction redoAction = new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
                undo.redo();
            } catch (CannotUndoException ex) {
                System.err.println("Cannon undo");
                ex.printStackTrace();
            }
        }
    };
    private UndoManager undo = new UndoManager();
    private JTextArea txt = new JTextArea(40, 40);
    private JMenuBar menuBar = new JMenuBar();
    private JMenu editMenu = new JMenu("Edit");
}
4

2 に答える 2

3

使用する

private AbstractAction redoAction = new AbstractAction("Redo"){...}

private AbstractAction redoAction = new AbstractAction("Undo"){...}

また、例外で爆発させる代わりに、次のことができます

            if(undo.canUndo())
            {
                undo.undo();
            }

            if(undo.canRedo())
            {
                undo.redo();
            }
于 2011-07-25T19:39:05.053 に答える
0

String 引数を AbstractAction コンストラクターに渡すと、問題が解決しました。ありがとうバラR。

于 2011-07-25T19:37:00.833 に答える