Java 创建JToolBar时出错

Java 创建JToolBar时出错,java,swing,user-interface,action,jtoolbar,Java,Swing,User Interface,Action,Jtoolbar,向工具栏添加按钮时出现此错误 线程“AWT-EventQueue-0”java.lang.ClassCastException中的异常:Sketcher.SketcherFrame$ColorAction不能强制转换为javax.swing.Icon ColorAction是一个用于创建更改JFrame背景颜色的工具栏按钮的类。它扩展了javax.swing.AbstractAction ColorAction类型的按钮存储在ColorActions[]数组中,并将其小图标属性设置为适当的值 堆


向工具栏添加按钮时出现此错误
线程“AWT-EventQueue-0”java.lang.ClassCastException中的异常:Sketcher.SketcherFrame$ColorAction不能强制转换为javax.swing.Icon

ColorAction是一个用于创建更改JFrame背景颜色的工具栏按钮的类。它扩展了
javax.swing.AbstractAction

ColorAction
类型的按钮存储在
ColorActions[]
数组中,并将其
小图标
属性设置为适当的值

堆栈跟踪

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)

包含图像路径的常量文件

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");
}


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

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

但即使没有它,您的问题似乎是您将
抽象操作
图标
混淆了。抛出异常的对象期望实现
图标
,而您为它提供了
抽象操作
的实现

我可以建议两件事:

  • SketcherFrame$ColorAction
    中也实现
    图标
    。无论如何,您都可以实现多个接口。但是
  • …在我看来,创建一个既是
    抽象动作
    又是
    图标
    的类是一个糟糕的设计决策。因为您似乎在利用内部类,所以只需创建一个实现
    图标的内部类,并将其传递给触发该异常的任何对象

  • 请参见,图像的路径存储为Icon类型的常量值(在常量文件中),小图标(现在更改为大图标)具有这些值。所有其他按钮(12个中的8个)都添加得很好。我将标记代码,hold.Done,新的堆栈跟踪(神奇地出现)和被标记的行已标记为>>Hmmm…您使用的是什么Java?我正在检查Java 6和Java 7的文档中是否有
    AbstractButton
    ,似乎找不到名为
    setIconFromAction
    的方法。链接:Java6--,Java7--BTW,如果您为终端调用配置了Java,您可以通过
    Java-version
    javac-version
    进行检查。如果您使用的是IDE,只需搜索如何在该IDE中检查Java版本,因为它可能有所不同。这是由于拼写错误造成的。你能包括ColorAction的代码吗。。
    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;
        }