【问题标题】:JMenu pressed throws exceptionJMenu按下抛出异常
【发布时间】:2011-10-12 20:32:18
【问题描述】:

在我的应用程序中,当我在我的 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");
}

【问题讨论】:

  • 该死...将“重做”参数添加到 AbstractAction 构造函数解决了该死 =)。非常感谢老兄!
  • 建议的代码正在运行,直到您使用NullPointerException 发布整个堆栈跟踪甚至行号,我们无法帮助您..
  • 你有什么Java版本,目标编译Java版本是什么?代码正常工作,只是菜单上没有标签,这很奇怪..

标签: java swing undo-redo jmenuitem


【解决方案1】:

使用

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

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

你也可以这样做

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

            if(undo.canRedo())
            {
                undo.redo();
            }

【讨论】:

    【解决方案2】:

    将字符串参数传递给 AbstractAction 构造函数解决了这个问题。谢谢巴拉 R.

    【讨论】:

    • 这应该作为对 Bala R 答案的评论输入。如果该答案解决了问题,请将其标记为“正确”以帮助人们稍后搜索。
    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多