1

除了颜色按钮之外,所有按钮都添加得很好
向工具栏添加按钮时出现此错误
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: Sketcher.SketcherFrame$ColorAction cannot be cast to javax.swing.Icon

ColorAction 是一个用于创建更改 JFrame 背景颜色的工具栏按钮的类。它延伸javax.swing.AbstractAction.
按钮类型ColorAction存储在一个ColorActions[]数组中,并将其SMALL_ICON属性设置为适当的值。

堆栈跟踪

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: Sketcher.SketcherFrame$ColorAction cannot be cast to javax.swing.Icon
    at javax.swing.AbstractButton.setIconFromAction(Unknown Source)
    at javax.swing.AbstractButton.configurePropertiesFromAction(Unknown Source)
    at javax.swing.AbstractButton.setAction(Unknown Source)
    at javax.swing.JButton.<init>(Unknown Source)
    at Sketcher.SketcherFrame.addToolBarButton(SketcherFrame.java:182)
    at Sketcher.SketcherFrame.createToolbar(SketcherFrame.java:174)
    at Sketcher.SketcherFrame.<init>(SketcherFrame.java:27)
    at Sketcher.Sketcher.createGUI(Sketcher.java:16)
    at Sketcher.Sketcher.access$1(Sketcher.java:15)
    at Sketcher.Sketcher$1.run(Sketcher.java:10)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(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.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)

突出显示的方法

private void createColorMenu() {
    createElementColorActions();
    colorMenu = new JMenu("Color");
    colorMenu.setMnemonic('M');
    createRadioButtonDropDown(colorMenu,colorActions,blueAction);
    menuBar.add(colorMenu);
}  

private void createRadioButtonDropDown(JMenu menu, Action[] actions,Action selected){
        ButtonGroup group = new ButtonGroup();
        JRadioButtonMenuItem item = null;
        for(Action action : actions){
            group.add(menu.add(item = new JRadioButtonMenuItem(action)));
            if(action==selected){
                item.setSelected(true);
            }
        }
    }

private void addToolBarButton(Action action){
        >>JButton button = new JButton(action);
        button.setBorder(BorderFactory.createCompoundBorder(new EmptyBorder(2,5,5,2),
                            BorderFactory.createRaisedBevelBorder()));
        button.setHideActionText(true);
        toolBar.add(button);
    }

private void createToolbar(){
        for(FileAction action : fileActions){
            if(action!=exitAction && action!=closeAction){
                addToolBarButton(action);
            }
        }
        toolBar.addSeparator();
        for(ColorAction action : colorActions){
            >>addToolBarButton(action);
        }
        toolBar.addSeparator();
        for(TypeAction action : typeActions){
            addToolBarButton(action);
        }
    }

包含图像路径的常量文件

import java.awt.Color;
import javax.swing.*;
public class SketcherConstants {
    public final static int LINE = 101;
    public final static int RECTANGLE = 102;
    public final static int CIRCLE = 103;
    public final static int CURVE = 104;

    public final static int DEFAULT_ELEMENT_TYPE = LINE;
    public final static Color DEFAULT_ELEMENT_COLOR = Color.blue;

    public final static String imagePath = "H:/Fasih/SketcherIcons/";
    public static final Icon NEW16 = new ImageIcon(imagePath+"new.GIF");
    public static final Icon OPEN16 = new ImageIcon(imagePath+"open.GIF");
    public static final Icon SAVE16 = new ImageIcon(imagePath+"save.GIF");
    public static final Icon PRINT16 = new ImageIcon(imagePath+"print.GIF");
    public static final Icon SAVEAS16 = new ImageIcon(imagePath+"saveas.GIF");

    public static final Icon LINE16 = new ImageIcon(imagePath+"line.PNG");
    public static final Icon CURVE16 = new ImageIcon(imagePath+"curve.PNG");
    public static final Icon RECTANGLE16 = new ImageIcon(imagePath+"square.PNG");
    public static final Icon CIRCLE16 = new ImageIcon(imagePath+"circle.PNG");

    public static final Icon RED16= new ImageIcon(imagePath+"red.GIF");
    public static final Icon GREEN16= new ImageIcon(imagePath+"green.GIF");
    public static final Icon YELLOW16= new ImageIcon(imagePath+"yellow.GIF");
    public static final Icon BLUE16= new ImageIcon(imagePath+"blue.GIF");
}

class ColorAction extends AbstractAction {
        public ColorAction(String name,Color color){
            super(name);
            this.color = color;
        }
        public ColorAction(String name,Color color,char ch,int modifiers){
            this(name,color);
            putValue(ACCELERATOR_KEY,KeyStroke.getKeyStroke(ch,modifiers));
            int index = name.toUpperCase().indexOf(ch);
            if(index!=-1){
                putValue(DISPLAYED_MNEMONIC_INDEX_KEY,index);
            }
        }
        public void actionPerformed(ActionEvent e){
            elementColor = color;
            getContentPane().setBackground(color);
        }
        private Color color;
    }

如果我删除颜色按钮,则添加打开、关闭、保存按钮就可以了。我不知道为什么不能添加这些。

4

1 回答 1

2

首先,请指出您的代码中触发此异常的确切行。查看堆栈跟踪,我假设这是 SketcherFrame.java 第 153 行。调试起来会更容易。

但即使没有这个,你的问题似乎是你AbstractActionIcon. 抛出异常的任何东西都期望实现,Icon而您给了它一个实现AbstractAction.

我可以建议两件事:

  1. 实施IconSketcherFrame$ColorAction好。无论如何,您都可以实现多个接口。但...
  2. ...在我看来,创建一个既是 anAbstractAction又是 an 的类Icon是一个糟糕的设计决策。既然您似乎正在使用内部类,只需创建一个内部类实现Icon并将其传递给触发该异常的任何东西。
于 2012-08-05T08:00:16.850 回答