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