
在将按钮添加到工具栏时,我会得到此错误。
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;
}如果我删除的颜色按钮,然后打开,关闭,保存按钮是添加很好。我不知道为什么这些不能加进去。
发布于 2012-08-05 08:00:16
首先,请指出触发此异常的代码中的确切行。查看堆栈跟踪,我假设这是SketcherFrame.java第153行。这样更容易调试。
但是,即使没有这一点,您的问题似乎是您混淆了AbstractAction和Icon。不管抛出什么,异常都是期望Icon的实现,而您给了它一个AbstractAction的实现。
我可以提出两件事:
Icon中实现SketcherFrame$ColorAction。无论如何,您可以实现多个接口。但是..。AbstractAction和Icon的类是一个错误的设计决策。由于您似乎在使用内部类,所以只需创建一个实现Icon的内部类,并将其传递给触发该异常的任何内容。https://stackoverflow.com/questions/11814785
复制相似问题