gpt4 book ai didi

java - 创建 JToolBar 时出错

转载 作者:行者123 更新时间:2023-11-30 04:42:58 25 4
gpt4 key购买 nike

All buttons are added fine apart from the color buttons
在向工具栏添加按钮时出现此错误
线程“AWT-EventQueue-0”中的异常 java.lang.ClassCastException:Sketcher.SketcherFrame$ColorAction 无法转换为 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;
}

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

最佳答案

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

但即使没有这个,您的问题似乎是您将 AbstractActionIcon 混淆了。无论引发异常的是什么,都需要 Icon 的实现,而您为其提供了 AbstractAction 的实现。

我可以建议两件事:

  1. 也在 SketcherFrame$ColorAction 中实现 Icon。无论如何,您可以实现多个接口(interface)。但是...
  2. ...在我看来,创建一个既是 AbstractAction 又是 Icon 的类是一个糟糕的设计决策。由于您似乎正在利用内部类,因此只需创建一个实现 Icon 的内部类并将其传递给触发该异常的任何内容。

关于java - 创建 JToolBar 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11814785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com